Python perusteet - Demo 2
Näissä demoissa tutustutaan Pythonin ja CGI-ohjelmoinnin perusteisiin.
users.jyu.fi-palvelimessa on käytössä Python 2.4.3. Pythonin uudempien versioiden ominaisuudet eivät siis toimi. Tämän demotehtävän tekemisen apuna kannattaa käyttää seuraavia dokumentteja:
Opettele käyttämään myös Pythonin komentotulkin help-komentoa.:
[tjlahton@halava ~]$ python Python 2.4.3 (#1, Jun 11 2009, 14:09:37) [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> help Type help() for interactive help, or help(object) for help about object. >>> import cgi >>> help(cgi) Help on module cgi: NAME cgi - Support module for CGI (Common Gateway Interface) scripts. ... ... ...
CSS:n vaihtaminen vuodenajan mukaan
Tehtävässä vaihdetaan XHTML-sivun tyylitiedostoa vuodenajasta riippuen. Käytettävät tyylit ovat seuraavat:
- Talvi (joulukuu-helmikuu): http://www.danielgreene.com/styles/photo.css
- Kevät (maaliskuu-toukokuu): http://www.danielgreene.com/styles/pretty.css
- Kesä (kesäkuu-elokuu): http://www.danielgreene.com/styles/oldstyle.css
- Syksy (syyskuu-marraskuu): http://www.danielgreene.com/styles/typewriter.css
- Luo haluamallasi editorilla vuodenaika.cgi-tiedosto ja tallenna se W-asemallesi
cgi-bin/-kansioon.
Huomaa, että käyttämäsi editorin täytyy osata tallentaa tekemäsi tiedosto unix-muodossa eikä windows-muodossa. Pythonin ei pitäisi välittää eri ympäristöjen rivinvaihtojen eroista mutta jostain syystä jalavassa oleva python on hieman kranttu.
Luo kansio tarvittaessa. HUOM! Kansion täytyy ehdottomasti olla cgi-bin eikä mikään muu. - Kopioi ohjelmasi pohjaksi seuraava koodi:
#!/usr/bin/python # -*- coding: iso-8859-1 -*- import cgitb cgitb.enable() import cgi import time import datetime print """Content-type: text/html <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi"> <head> <link rel="StyleSheet" href="tyyli.css" type="text/css" /> <title></title> </head> <body> </body> </html> """
- Kokeile ohjelman toimintaa komentorivillä jalava/halava-koneessa:
[tjlahton@jalava cgi-bin]$ ./vuodenaika.cgi
Toimiakseen ohjelma vaatii suoritusoikeuden (execute) kaikille käyttäjille. Jos ohjelmasi toimii moitteetta komentoriviltä voit kokeilla sitä selaimella osoitteesta:
http://users.jyu.fi/~omatunnus/cgi-bin/vuodenaika.cgi
Jos ohjelma ei toimi selaimella niin tarkista tietohallintokeskuksen ohje CGI/SSI-tekniikat ja varmista, että editorisi käyttää unix-tyylisiä rivinvaihtoja..
- Muuta valmista koodia sen verran, että jaat tulostukset useampaan eri osaan. Ensimmäinen osa tulostaa sivun mediatyypin ja tyhjän rivin. Toisessa osassa voit tulostaa sivun alkuosan body-elementtiin saakka ja kolmannessa osassa sivun varsinaisen sisällön. Varmista, että ohjelmasi toimii. Muista jatkossa varmistaa ohjelmasi toiminta tarpeeksi usein. Älä kirjoita liian pitkiä ohjelmakoodipätkiä testaamatta.
- Luo ennen head-osan tulostamista merkkijonomuuttuja
tyyli
ja alusta se tyhjäksi. - Luo lukumuuttuja
kuukausi
, johon laitat arvoksi meneillään olevan kuukauden numeron. Tämän saat selville seuraavalla tavalla datetime-kirjaston avulla:kuukausi = datetime.datetime.now().month
tai
tanaan = datetime.datetime.now() kuukausi = tanaan.month
- Tee seuraavaksi if...elif...else-kontrollirakenne, missä sijoitat halutun tyylitiedoston osoitteen
tyyli
-muuttujaan meneillään olevan vuodenajan perusteella.- Tarkista ensin
if
-lauseella, onko meneillään talvi.if
-lauseen ehdoksi täytyy siis laittaa se, että kuukausi on joko 12, 1 tai 2.if kuukausi==12 or kuukausi==1 or kuukausi==2: tyyli = "http://www.danielgreene.com/styles/photo.css"
HUOM! Pythonissa lohkot merkitään sisentämällä! Sama sisennystaso tarkoittaa siis samaa lohkoa - Tarkista
elif
-lauseilla, onko meneillään kevät tai kesä. Kevään kohdalla ehdoksi täytyy siis määritellä, että kuukausi on välillä 3-5 eli suurempi tai yhtäsuuri kuin 3 ja pienempi tai yhtäsuuri kuin 5. Kesän kohdalla vastaava ehto on suurempi tai yhtäsuuri kuin 6 ja pienempi tai yhtäsuuri kuin 8. Alla esimerkki keväänelseif
-rakenteesta.elif kuukausi >= 3 and kuukausi <= 5: tyyli = "http://www.danielgreene.com/styles/pretty.css"
- Aseta lopuksi
else
-lauseessatyyli
-muuttujan arvoksi syksyn tyylitiedoston osoite.
- Tarkista ensin
- Nyt oikea tyylitiedoston osoite on
tyyli
-muuttujassa, eli enää tarvitsee määrittää sivu käyttämään tyylitiedostoa kyseisestä muuttujasta.- Tulosta tyylimääritys
print
-komennolla. Laita tyylin nimen paikalletyyli
-muuttuja. Joudut ensin tutustumaan Pythonin merkkijonojen muotoiluun. Korvaa tyylitiedoston osoite tyyli.css merkinnällä %s<link rel="StyleSheet" href="%s" type="text/css" /></pre>
Seuraavaksi lisää tulostuksen lopettavan """-merkinnän perään % tyyli:""" % tyyli
Tämä merkintä tarkoittaa, että %s korvataan merkkijonolla, joka saadaan tyyli-muuttujasta. Merkintätapa pitäisi olla tuttu printf- ja sprintf-funktioista esim. C/C++-kielestä.
- Tulosta tyylimääritys
- Kokeile sivun toimintaa selaimella ja korjaa virheet tarvittaessa.
- Muuta ohjelmaasi siten, että css-tiedostoa ei valitakkaan kuukauden mukaan vaan se arvotaan satunnaisesti.
- Lisää sivulle lomake jolla käyttäjä voi itse antaa sivulla käytettävän css-tiedoston osoitteen
- Laita lomakkeeseen yksi tekstikenttä ja submit-painike. Aseta lomakkeen action-ominaisuuden osoitteeksi python-ohjelmasi osoite.
- Käytä Pythonin cgi-kirjastoa ja ota sivulla käyttöön lomakkeelle syötetty css-tiedoston osoite.
form = cgi.FieldStorage() # alustaa lomake-olion url = form.getfirst("url", "") #pyytää ensimmäisen url-nimisen lomakekentän arvon
- Tulosta annetun css-tiedoston osoite sivulle näkyviin p-elementin sisällä
- Voit testata vaikka seuraavilla css-tiedostoilla:
- http://appro.mit.jyu.fi/appro.css
- http://hazor.iki.fi/hazor.css
- Mahdollista jo tiedossaolevien css-tiedostojen käyttäminen
- Parantele lomaketta ja lisää siihen alasvetovalikko (select-elementti) jossa on listattuna kaikki ohjelmassasi olevassa listassa luetellut css-tiedostot.
- Muuta ohjelman toimintaa sen verran, että jos käyttäjä ei syötä uutta osoitetta eli jättää kentän tyhjäksi niin silloin käytetään käyttäjän alasvetovalikosta valitsemaa css-tiedostoa
- Edelleen parantele ohjelmaa siten, että käyttäjän itse lisäämät css-tiedostojen osoitteet tulevat mukaan alasvetovalikkoon.
- Älä yritä tallentaa käyttäjän lisäyksiä tiedostoon tms. Tulosta kaikki tiedossa olevat css-tiedostojen osoitteet (valmiit ja käyttäjän lisäämät) lomakkeelle piilokenttinä (hidden)
- Aina kun ohjelmasi saa lomakkeen tiedot käsiteltäväksi sen pitää tarkistaa hidden-kenttinä tuleva mahdollinen listaus css-tiedostoista. Jos sitä ei tule niin alasvetovalikossa pitää käyttää valmista listaa mutta muutoin lomakkeelta tulevia tietoja
Käyttäjien kommentit