Apache ja mod_python - Demo 3
Tehdään kurssille arvosanalaskuri opiskelijan ja opettajan tueksi.
Lomake PSP:lla

- Luo W-aseman sovellukset-hakemistoon uusi alihakemisto demo3
- 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
- Luo kansioon uusi PSP-tiedosto index.psp
- Avaa lomakkeen pohja ja kopioi kaikki XHTML-elementit PSP-sivulle.
- Kokeile sivua osoitteesta http://users.jyu.fi/~omatunnus/sovellukset/demo3/.
- 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.
- Tutustu mod_pythonin tutoriaaliin ja mod_python-manuaaliin.
Tietojen validointi
- 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ä.
- 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.
- 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.
- Aseta kuhunkin lomakkeen kenttään oletusarvoksi edellisellä kerralla syötetty teksti tai valinta
- 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ä. - 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.
- 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:
- Kirjoita moduuliksi haluamasi osa ohjelmastasi (luokka, funktiota etc.) omaksi python-tiedostokseen esim. omat.py
- Tallenna moduulisi haluamaasi kansioon
- Kirjoita ohjelma jossa haluat käyttää moduuliasi. Ota moduuli käyttöön
seuraavalla tavalla:
import sys sys.path.append( "/home3/368/tjlahton/html/python/luento6" ) import omat
kansio jossa moduulisi sijaitsee on lisättävä pythonin polkuun. Polku on esitettävä samalla tavalla kuin tietohallintokeskuksen salasanasuojausohjeessa neuvotaan.
- Selvitä kotihakemistosi polku komennolla echo $HOME ja pidä tämä mielessä jatkoa varten
- Polku on muotoa /homeX/YYY/käyttäjätunnuksesi/html/kansio Korvaa /homeX/YYY/käyttäjätunnuksesi aiemmin echo $HOME -komennon avulla selvittämälläsi hakemistopolulla (HUOM! Www-palvelimen näkemät polut.eivät ala /wwwhome, joka on vain suorakäyttökoneita varten tehty erikoisjärjestely, vaan /homeX, kuten yllä esimerkissä)
-
moduulin nimi on lisättävä luokan tai funktion nimen eteen moduuliin sijoitettuja luokkia tai funktioita käytettäessä:
nimi = oma.input("nimi", "Tommi")
Laskentaa
Tulostetaan keskiarvo, jos kaikki tiedot on hyväksytty. Lasketaan aluksi normaali keskiarvo, jonka voi myöhemmin muuttaa painotetuksi keskiarvoksi.
- Summaa viikkotehtäväpisteet johonkin väliaikaiseen muuttujaan.
- 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.
selecttaicheckbox-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ä.
- Huomaa, että
koska kyse on tekstilaatikoista, niin jokaisesta laatikosta tulee vähintään tyhjä merkkijono.
Sama ei päde esim.
- 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.
- Tee ensin lista, jossa on
option-elementin vaihtoehdot eli tiedekunnat. - Luo
select-elementin aloituksen ja lopetuksen väliinfor-silmukka, joka käy läpi taulukon alkiot. Aloita indeksinumero 0:sta ja päätä taulukon alkoiden määrään - Tulosta
option-elementti, jossa on taulukon teksti javalue-ominaisuuteen indeksin arvo. - 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ä?
- Lisää sivun alkuun muuttuja, joka kertoo viikkotehtävien määrän.
- Tee ensimmäisen
tr-elementin sisällefor-silmukka, joka käy läpi numerot yhdestä viikkotehtävien määrään. Tulostathjalabel-elementtejä silmukan sisällä. Numerot saat silmukan indeksistä. - Tee toisen
tr-elementin sisälle vastaava silmukka. Nyt on tulostettavatdjainput-elementtejä. - 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?

- Tallenna sivu toisella nimellä. Poista alusta henkilötietojen kyselyt.
- Lisää taulukkomuuttuja, jossa on muutaman oppilaan nimi.
- Kapseloi viikkotehtäväpisterivin tulostava silmukka toisella
foreach-silmukalla, joka käy läpi kaikki opiskelijat. - Tulosta rivin ensimmäiseen soluun (th) opiskelijan nimi.
- 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:
- 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 - 2 | 1 |
| 3 - 4 | 1,5 |
| 5 - 7 | 2 |
| 8 - $n | 2,5 |
- Muuta for-silmukkaa siten, että saat taulukon avaimen johonkin muuttujaan.
- 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:
- Kurssit ja näiden lisääminen
- Kurssien vaihteleva demokertojen määrä
- Bonuspisterajat
Jatkossa voisi miettiä myös seuraavia laajennusmahdollisuuksia:
- Useiden kurssitietojen muuttaminen kerralla
- Tietojen tallentaminen
- Kurssiarvosanalaskuri, jossa huomioidaan demobonus- ja tenttipisteet sekä arvosanan laskentatapa
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.
- Lisää johonkin kansioon .htaccess-tiedostoon rivi:
Redirect permanent /~omatunnus/polku/kansioon/ http://users.jyu.fi/~omatunnus/toinen/kansio/
Edelleenohjattavan sivun (tiedoston) osoite kerrotaan absoluuttisesti palvelimen juuresta lukien. Uusi osoite pitää ilmoittaa kokonaisuudessaan. - Kokeile ohjautuuko kansio uuteen osoitteeseen.
- Jättämällä permanent-sana pois saataisiin tehtyä väliaikainen edelleenohjaus, jonka kohdalla esim. google säilyttää muistissaan alkuperäisen osoitteen mutta hakee sisällön uudesta osoitteesta.
- Tyypillisin esimerkki edelleenohjauksesta on WWW-palvelimien automaattisesti tekemä edelleenohjaus jos www-sivun osoite viittaa kansioon mutta osoitteesta jätetään pois viimeinen /-merkki. esim. annetaan osoitteeksi http://appro.mit.jyu.fi/sovellukset/demot/demo3 eikä http://appro.mit.jyu.fi/sovellukset/demot/demo3/. Ensimmäinen osoite viittaa demo3-nimiseen tiedostoon ja jos sitä ei löydy niin Apache edelleenohjaa automaattisesti demo3/-kansioon.
Salasanasuojaus
Yksittäinen kansio on helppo suojata salasanalla.
- Lisää johonkin kansioon
.htaccess-tiedosto ja kirjoita sinne:
AuthUserFile /foo/bar/tunnus/.users AuthGroupFile /dev/null AuthName ByPassword AuthType Basic <Limit GET> require valid-user </Limit>
AuthUserFile-kohtaan pitää kertoa hakemistopolku tiedostoon josta löytyvät käyttäjätunnukset ja salasanat. Tämä polku pitää selvittää tietohallintokeskuksen ohjeen mukaan. - Laita oikea polku .htaccess-tiedostoon ja polun perään tiedostonnimeksi .users
- Luo käyttäjätunnus ja salasana komennolla:
htpasswd -c .users tunnus
- Lisää lukuoikeudet kaikille tiedostoon .users, niin palvelin pystyy lukemaan käyttäjätunnukset ja salasanat. Käyttäjätiedoston salasanat ovat kryptattuja, mutta salaamatonta yhteyttä käyttävään salasanavarmennukseen ei voi yksinään luottaa tärkeitä tietoja välitettäessä.
- Kokeile kysyykö selain tunnusta ja salasanaa
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.
- Lisää .htaccess-tiedostoon seuraavilla riveillä type maps -tyyppinen automaattinen kielivalinta rivit:
# Tehdään var-päätteisistä tiedostoista tyyppikartta-tiedosto, # joka kertoo mikä tiedosto sisältää mitäkin kieltä AddHandler type-map .var ## Käytetään kansion indeksitiedostona index.var-tiedostoa ## tavallisen index.shtml-tiedoston sijaan ## Määrätään indeksitiedostovaihtoehdot: DirectoryIndex index.var index.html index.shtml
- Seuraavaksi luo index.var-tiedosto ja lisätään siihen rivit:
URI: index.en.html Content-type: text/html Content-language: en URI: index.fi.html Content-type: text/html Content-language: fi
Yllä kerrotaan, että index.en.html-tiedosto sisältää englanninkielisen version ja index.fi.html-tiedosto suomenkielisen version. Luo nämä tiedostot.
- Kokeile selaimella kansiota johon määritit monikieliset indeksitiedostot. Muuta selaimen kieliasetuksia ja kokeile muuttuuko sivu.
- Poista .htaccess-tiedostoon tekemäsi määrittelyt ja kokeile toimiiko kielivalinta myös ilman niitä eli onko palvelimessa Multiviews-ominaisuus päällä.

Käyttäjien kommentit