Apache ja mod_python - Demo 3

Tehdään kurssille arvosanalaskuri opiskelijan ja opettajan tueksi.

Lomake PSP:lla

Arvosanalaskuri

  1. Luo W-aseman sovellukset-hakemistoon uusi alihakemisto demo3
  2. Luo kansioon .htaccess-tiedosto ja kirjoita sinne rivit:
    #käsitellään mod_pythonilla .psp ja .psp_-tiedostot
    AddHandler mod_python .psp .psp_
    
    #määrätään käsittelijäksi mod_python.psp eli python server pages
    PythonHandler mod_python.psp
    
    #tulostetaan virheilmoitukset sivulle
    PythonDebug on
    
  3. Luo kansioon uusi PSP-tiedosto index.psp
  4. Avaa lomakkeen pohja ja kopioi kaikki XHTML-elementit PSP-sivulle.
  5. Kokeile sivua osoitteesta http://users.jyu.fi/~omatunnus/sovellukset/demo3/.
  6. Aseta lomakkeen käsittelijäksi sivu itse. Tämä onnistuu helpoimmin Request-objektista löytyvällä uri-ominaisuudella:
    <form action="<%= req.uri %>" method="get">
    • Yksittäisten python-kielen muuttujien tai lausekkeiden arvot voidaan tulostaa tekstin sisään <%= ... %>-merkinnällä.
    • Pitemmät koodilohkot sijoitetaan <% ... %>-merkinnän sisään.
    • print-funktiota ei pidä käyttää vaan tarvittaessa voi tulostuksia tehdä req.write-funktiolla.
  7. Tutustu mod_pythonin tutoriaaliin ja mod_python-manuaaliin.

Tietojen validointi

  1. Tee lomakkeen alkuun tarkistus, että etunimi ja sukunimi on täytetty ja tiedekunta on valittu. Tee tarkistus vain jos lomake on täytetty eli tarkistusta ei pidä tehdä sivulle ensimmäistä kertaa tultaessa.
    • Tarkistuksissa tarvitset req.form-ominaisuutta niin pääset käsiksi lomaketietoihin FieldStorage-objektin kautta. Muista käsitellä myös aloitustilanne jolloin mitään lomaketta ei ole vielä täytetty. Käytä apunasi Pythonin manuaalia.
    • Lisää virheilmoitukset yhteen virhesanakirjaan, jossa avaimena käytetään virheellisen kentän nimeä ja arvona virheilmoitustekstiä.
  2. Jos tiedot ovat ok, niin tulosta toistaiseksi etunimi, sukunimi ja tiedekunnan numero. Tulosteista kannattaa poistaa HTML-erikoismerkit cgi.escape-funktiolla.
    • Joudut jakamaan dokumentin kahteen osaan ehtorakenteella: toisessa osassa on kaikki lomakkeen tulostamiseen liittyvät jutut ja toisessa osassa varsinaiset tulokset.
    • Tulokset näytetään, jos submit-nappulaa on painettu eikä virheitä ole tullut.
  3. Jos tiedoissa oli virheitä, niin tulosta virhe-ilmoitus seuraavilla tavoilla:
    • Ensimmäinen versio: Jos virheitä on niin tulosta yleinen virheilmoitus.
    • Toinen versio: Käy läpi kaikki virhetaulukon virheet ja tulosta ne lomakkeen alussa.
    • Kolmas versio: Tulosta kunkin lomake-elementin viereen siihen liittyvä virheilmoitus.
  4. Aseta kuhunkin lomakkeen kenttään oletusarvoksi edellisellä kerralla syötetty teksti tai valinta
  5. Tekstikentissä, joihin pitäisi syöttää viikkotehtävien pisteet, ei ole vielä name-ominaisuutta asetettu. Mitä name-ominaisuuksiin pitäisi laittaa, että saat kaikki viikkotehtäväpisteet varmasti oikein ja kätevästi käsiteltäväksesi? Huomaathan, että selain voi lähettää lomakkeen kenttien arvot satunnaisessa järjestyksessä.
  6. Tarkista, että viikkotehtäviin on laitettu numero. Tarkista, että numero on väliltä 0-5. Älä kuitenkaan herjaa tyhjästä tekstilaatikosta. Kokeile tehdä tarkistus siten, että käyt yhdessä silmukassa läpi kaikki viikkotehtävien syötteet. Koko ryhmää koskeva virheilmoitus riittää toistaiseksi.
  7. Aseta lomakkeen lähetysmetodiksi post. Muuttuiko lomakkeen toiminta? Napauta selaimen osoiteriville ja paina enteriä, jos haluat testata lomaketta, niin ettei POST-muuttujia lähetetä uudelleen.

Moduulit

Voit halutessasi jakaa ohjelmakoodisi erillisiin moduuleihin:

Laskentaa

Tulostetaan keskiarvo, jos kaikki tiedot on hyväksytty. Lasketaan aluksi normaali keskiarvo, jonka voi myöhemmin muuttaa painotetuksi keskiarvoksi.

  1. Summaa viikkotehtäväpisteet johonkin väliaikaiseen muuttujaan.
  2. Laske syötettyjen kertojen määrä taulukosta
    • Huomaa, että koska kyse on tekstilaatikoista, niin jokaisesta laatikosta tulee vähintään tyhjä merkkijono. Sama ei päde esim. select tai checkbox-käyttöliittymäkomponentteihin. Aiheesta tarkemmin W3C:n forms-dokumentissa. Koska tekstilaatikoiden määrä on kiinteä, niin turvallisinta olisi selvittää tekstilaatikoiden määrä jostain muualta kuin käyttäjän syötteestä.
  3. Jaa pistesumma kertojen määrällä ja printtaa se tulossivulle sopivan XHTML-elementin sisälle.

Dynaaminen valintalista

Ongelmana on saada selected="selected" oikean option-elementin kohdalle. Koodi pystyy paremmin ylläpidettävänä, kun emme jokaisen option-elementin kohdalla jossittele oliko tämä edellisellä täyttökerralla valittu vaihtoehto.

  1. Tee ensin lista, jossa on option-elementin vaihtoehdot eli tiedekunnat.
  2. Luo select-elementin aloituksen ja lopetuksen väliin for-silmukka, joka käy läpi taulukon alkiot. Aloita indeksinumero 0:sta ja päätä taulukon alkoiden määrään
  3. Tulosta option-elementti, jossa on taulukon teksti ja value-ominaisuuteen indeksin arvo.
  4. Kun indeksi on sama kuin lomakkeelta saatu arvo, niin tulosta option-elementtiin lisäksi teksti selected="selected".

Soveltavia tehtäviä

Seuraavista tehtävistä saa hyvää treenausta vaativimpia viikkotehtäviä varten.

Dynaaminen taulukko

Mitä jos viikkotehtävien määrä muuttuu? Kuinka paljon muutosvaivaa on nähtävä?

  1. Lisää sivun alkuun muuttuja, joka kertoo viikkotehtävien määrän.
  2. Tee ensimmäisen tr-elementin sisälle for-silmukka, joka käy läpi numerot yhdestä viikkotehtävien määrään. Tulosta th ja label-elementtejä silmukan sisällä. Numerot saat silmukan indeksistä.
  3. Tee toisen tr-elementin sisälle vastaava silmukka. Nyt on tulostettava td ja input-elementtejä.
  4. Keskiarvon laskennan pitäisi toimia edelleen, koska se käy kaikki tehtäväkerrat läpi.

Opettajan lomake

Miten opettaja voisi syöttää nopeasti monen opiskelijan tiedot ja saada kerralla kaikkien keskiarvot?

Opettajan pistelaskurilomake

  1. Tallenna sivu toisella nimellä. Poista alusta henkilötietojen kyselyt.
  2. Lisää taulukkomuuttuja, jossa on muutaman oppilaan nimi.
  3. Kapseloi viikkotehtäväpisterivin tulostava silmukka toisella foreach-silmukalla, joka käy läpi kaikki opiskelijat.
  4. Tulosta rivin ensimmäiseen soluun (th) opiskelijan nimi.
  5. Tallenna name-ominaisuuteen tieto opiskelijan nimestä ja tehtävän numerosta. HTML-koodiin pitäisi tulla siis esimerkiksi
    <tr>
        <th scope="row">Nano Nano</th>
        <td><input type="text" name="vt_Nano Nano_1" /></td>
        ...
        <td><input type="text" name="vt_Nano Nano_9" /></td>
    </tr>
    <tr>
        <th scope="row">Diiba Daaba</th>
        <td><input type="text" name="vt_Diiba Daaba_1_" /></td>
        ...
        <td><input type="text" name="vt_Diiba Daaba_9_" /></td>
    </tr>
    ...
    
    • Lisätietoa: Huomaa, että HTML 4.0 ei salli name-attribuutin arvossa mitään erikoismerkkejä (esim. hakasulkeita, välilyöntejä tai ääkkösiä), mikä on PSP:n kannalta ongelmallista. XHTML on onneksi tässä suhteessa sallivampi. Jos haluat, että sivu on HTML4-yhteensopiva, joudutaan nimeäminen tekemään esimerkiksi tyyliin vt_n_m, missä n on opiskelijan nimen paikka taulukossa ja m on tehtävän numero. Tarkemmin aiheesta:
  6. Lisää keskiarvon laskennan ympärille for-silmukka, joka käy kaikki opiskelijat. Tulosta ensin opiskelijan nimi. Käy sitten sisemmässä silmukassa opiskelijan tulokset läpi ja summaa ne. Tulosta ulomman silmukan lopussa opiskelijan tehtävien keskiarvo.

Huomaa, että yhdellä labelilla ei pysty enää viittaamaan yhteen lomake-elementtiin. Tämä rikkoo hieman lomakkeemme esteettömyyttä. Käyttämällä th-elementeissä scope-ominaisuutta voidaan kuitenkin kertoa mikä on minkäkin taulukon solun otsikko.

Painotettu keskiarvo

Kurssilla arvioinnissa käytetään painotettua keskiarvoa. Muuta sovellusta siten, että se laskee normaalin keskiarvon sijaan painotetun keskiarvon seuraavan taulukon mukaan ($n = tehtävien määrä):

ViikkotehtäväPainokerroin
1 - 21
3 - 41,5
5 - 72
8 - $n2,5
  1. Muuta for-silmukkaa siten, että saat taulukon avaimen johonkin muuttujaan.
  2. Lisää silmukkaan kertoimen määritys avaimen perusteella. Laske kertoimien summa. Painotettua keskiarvoa laskettaessa sitä tarvitaan jakajana. Jakaja (=kertoimien summa) tulee laskettua turhaan useampaan kertaan, mutta tämä ei nyt haittaa.

Lisätehtäviä

Demopistelaskuri

Useiden matematiikan, fysiikan ja tietotekniikan kurssien arvioinnissa mitataan myös demotyöskentelyn aktiivisuutta. Aktiivisella demotyöskentelyllä saa lisäpisteitä tenttiin. Mieti miten laajentaisit opiskelijan arvosanalaskuria yleiseksi demopistelaskuriksi. Huomioitavaa:

Jatkossa voisi miettiä myös seuraavia laajennusmahdollisuuksia:

Edelleenohjaus

Monesti käy niin että dokumentit muuttavat paikkaansa ja saattaa olla hyvin vaivalloista muuttaa kaikkia niihin osoittavia linkkejä. Muiden tekemien linkkien muuttaminen on mahdotonta. Tällöin tulee ratkaisuksi edelleenohjaus jolla selain saadaan kulkeutumaan automaattisesti uuteen osoitteeseen.

Salasanasuojaus

Yksittäinen kansio on helppo suojata salasanalla.

Monikielisyys

HTTP-protokolla ja Apache-WWW-palvelin tukevat suoraan automaattista kielenvalintamekanismia, joka palauttaa selaimelle oikeankielisen dokumentin selaimen asetuksien mukaan. Selaimien kieliasetuksia voi säätää suoraan niiden asetuksista ja voi esim. laittaa kielet mieleiseensä järjestykseen.

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/demot/demo3/
© Antti Ekonoja (antti.j.ekonoja@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2010-02-03 15:12:05
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto