Python ja CGI-ohjelmointi - Luento 3
Python on korkean tason ohjelmointikieli, jonka suunnittelussa on panostettu erityisesti kielen luettavuuteen. Monesta muusta kielestä poiketen Python käyttää koodin sisennyksiä koodilohkojen merkintään.
Common Gateway Interface (CGI) on yksinkertaisin rajapinta WWW-sovelluksien tekemiseen.
Luentotaltiointi
- sovellukset03.wmv 37M
- sovellukset03.avi 170M
- sovellukset03.mp3 32M
Python
Pythonin syntaksiin kannattaa tutustua esim. seuraavien tutoriaalien ja ohjeiden avulla:
- Python ohjelmointiopas (PDF)
- Programming python
- Dive Into Python
- Python tutorial (v2.4.3 eli sama versio mitä on käytettävissä users.jyu.fissä)
- Python-ohjelmointikielen ominaisuuksia
- Python FAQ
Seuraavassa on käyty läpi tärkeimpiä Pythonin piirteitä. Lähteenä on käytetty pääasiassa Jussi Kasurisen Python ohjelmointiopasta ja Python tutoriaalia.
- Pythonia voi kokeilla jalava.cc.jyu.fi:ssä komentoriviltä kirjoittamalla: python
Pythonin objektien ominaisuuksia ja avustusta voi lukea kirjoittamalla help ja help(objekti)
- #-merkillä aloitetaan kommentit
- isot ja pienet kirjaimet merkityksellisiä
- Jos kirjoitat useamman komennon samalle riville niin ne erotetaan toisistaan puolipisteellä (;). Jos komennot ovat omilla rivillään ei mitään erotinmerkkiä tarvita. Suositeltavaa on kirjoittaa koodia tavalla jossa puolipisteitä ei tarvita.
- Välilyönnit (sisennys) rivin alussa on Pythonissa merkitsevä. Loogisesti samaan ryhmään kuuluvat koodirivit
pitää sisentää samalle tasolle.
- Älä sisennä tabulaattorimerkillä vaan vain välilyönneillä
- Suositus on sisentää neljä merkkiä kerrallaan
Muuttujat
- Muuttujia ei tarvitse erikseen esitellä
- Muuttujille ei tarvitse määrittää tyyppiä vaan tyyppi määräytyy automaattisesti
- Muuttujien tyyppiä joutuu kuitenkin joskus muuntamaan seuraavilla funktioilla.
- int(x [,base]) converts x to an integer
- float(x) converts x to a floating-point number
- str(x) converts x to a string representation
Merkkijonot
Pythonissa merkkijonoja voidaan esittää seuraavilla tavoilla:
- Käyttäen sitaattimerkiä (')
- Käyttäen lainausmerkkiä (")
- Käyttäen kolmea sitaatti- tai lainausmerkkiä (''', """) voit kirjoittaa useamman rivin pituisia merkkijonoja
- Merkkijonojen sisällä olevat erikoismerkit (',", \) merkitään \-merkin avulla esim. \' tai \" tai \\
- Merkkijonojen yhdistäminen tapahtuu kirjoittamalla merkkijonot peräkkäin esim.
print 'kukku' 'luuruu'print 'kukku' + 'luuruu'
tai voi käyttää +-operaattoria - Merkkijonoja voidaan palastella seuraavasti:
word = "abcdefghijklmnopqrstuvwxyz" print word[4] #tulostaa e print word[0:2] #tulostaa ab print word[3:5] #tulostaa de print word[:5] #tulostaa abcde print word[3:] #tulosta defghijklmnopqrstuvwxyz
Indeksit voivat olla myös negatiivisia jolloin ne lasketaan oikealta.
- Merkkijonoja ei voi muuttaa
word[4] = "q" # aiheuttaa virheen
- Merkkijonofunktioita
- str.find(sub[, start[, end]])
- str.isalnum()
- str.isalpha()
- str.isdigit()
- str.join(iterable)
- str.lower()
- str.lstrip([chars])
- str.replace(old, new[, count])
- str.rfind(sub[, start[, end]])
- str.rstrip([chars])
- str.split([sep[, maxsplit]])
- str.splitlines([keepends])
- str.strip([chars])
- str.upper()
Listat
Listojen palastelu tapahtuu samaan tapaan kuin merkkijonoilla.
Listoja voi muuttaa päinvastoin kuin merkkijonoja
a = [1, 2, 3, 'foo', 'bar'] a[0] = 3 # [3, 2, 3, 'foo', 'bar'] a[1] = a[2] * 3 #[3, 9, 3, 'foo', 'bar'] a[2:1] = ['kukku','luuruu'] # [3, 9, 3, 'kukku', 'luuruu', 'foo', 'bar']
Yhteisiä funktioita merkkijonoille ja listoille:
- x in s True if an item of s is equal to x, else False (1)
- x not in s False if an item of s is equal to x, else True (1)
- s + t the concatenation of s and t (6)
- s[i] i‘th item of s, origin 0 (3)
- s[i:j] slice of s from i to j (3)(4)
- s[i:j:k] slice of s from i to j with step k (3)(5)
- len(s) length of s
- min(s) smallest item of s
- max(s) largest item of s
Operaattorit
Seuraavassa on listattu Pythonin tärkeimmät operaattorit:
- = sijoitus
- + yhteenlasku
- - vähennyslasku
- * tulo
- ** potenssi
- / jako
- // tasajako eli kertoo kuinka monesti y menee x:ään
- % jakojäännös
- <
- >
- <=
- >=
- ==
- !=
- not boolean NOT
- and boolean AND
- or boolean OR
if
a = 3 if a> 0: print "a on suurempi kuin 0" elif a < 0: print "a on pienempi kuin 0" else: print "a on 0"
Toistorakenteet
laskuri = 12 while laskuri> 0: laskuri = laskuri - 1 a = [1,2,3,'foo','bar'] for x in a: print x for x in a[:]: #tekee kopion a:sta. tarpeellinen jos aikoo muuttaa listaa print x for i in range(1, 5): #range-funktio luo listan halutulta numeroväliltä print i
for käy järjestyksessä läpi rakenteen kaikki alkiot. vrt. Perlin foreach.
Läpikäytävää rakennetta ei pidä muuttaa läpikäynnin aikana. Jos muutoksia pitää tehdä niin on syytä käydä läpi rakenteen kopiota.
Funktiot
def summa(a, b): # laskee lukujen summan summa = a + b return summa
Funktioiden parametrit ovat referenssejä joten niiden arvojen muuttaminen vaikuttaa suoraan kutsuvaan ohjelmaan.
Moduulit
Pythonissa voi jakaa ohjelmansa moduuleihin tai käyttää valmiita moduuleja
import cgi
Oman moduulin voi luoda kirjoittamalla python-funktioita tiedostoon, jonka nimi päättyy .py
CGI-ohjelmointi Pythonilla
CGI eli Common Gateway Interface on yksinkertaisin rajapinta WWW-sovelluksien tekemiseen
XHTML-dokumentti Python-kielellä ja CGI-rajapinnan kautta tuotettuna:
#!/usr/bin/python # -*- coding: iso-8859-1 -*- 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> <title>Hello!</title> </head> <body> <h1>Tulostetaan Pythonilla:</h1> <p> """ print "Hello World!" print """ </p> </body> </html> """
- #!/usr/bin/python kertoo mistä www-palvelimen pitää etsiä käytettävää komentotulkkia eli tässä tapauksessa pythonia
- # -*- coding: iso-8859-1 -*- varmistaa, että lähdekoodi käsitellään ISO-8859-1-merkistönä eikä vahingossakaan esim. UTF-8-muotoisena
- print """Content-type: text/html Tulostetaan useampia rivi tekstiä jolloin pythonissa käytetään """-merkintää osoittamaan tulostuksen alku. Ensimmäiselle riville pitää tulostaa www-selaimen tarvitsema tieto dokumentin mediatyypistä HTTP-otsakkeena (text/html). Muitakin HTTP-protokollan otsakkeita voitaisiin tulostaa tässä vaiheessa. Varsinainen XHTML-dokumentti alkaa ensimmäisen tyhjän rivin jälkeen.
- """ Monen rivin tuloste loppuu
- print "Hello World!" Tavallinen yhden rivin tulostus
Virheilmoitukset ja asetukset
Pythonilla tehtyjen CGI-ohjelmien debuggaamista helpottaa cgitb-moduulin käyttöönotto:
import cgitb cgitb.enable()
cgitb aiheuttaa virheraporttien näyttämisen www-selaimessa tai niiden tallentamisen tekstitiedostoon.
CGI-ympäristömuuttujat:
import os print "Content-type: text/plain\r\n\r\n"; for param in os.environ.keys(): print "%20s: %s\n" % (param,os.environ[param])
cgi-moduuli
item = form.getvalue("item") if isinstance(item, list): else: import cgi form = cgi.FieldStorage() user = form.getfirst("user", "").upper() # Ei hajoa vaikka tulisi useampi arvo for item in form.getlist("item"): do_something(item)
HTML:n vaatimien erikoismerkkien koodaukseen voi käyttää cgi.escape(s[, quote])-metodia.
Käyttäjien kommentit
Erittäin hyvä opas!
Tosi asiallinen. Puuttuu kuitenkin tietoja pahimmista ongelmista mitä PHP-syntaksin kanssa voi tulla eteen. esim. Kuinka korjataan tällainen koodi? (Tehdäänkö nimen otto funktion avulla. Eikös se onnistunut pelkästään käyttämällä valmiita MUUTTUJIA. esim. nimi saatiin viittaamalla sitä lomakekenttää, johon käyttäjä kirjoittaa nimensä: a = $_POST[ "nimilomakekenttä" ]