Python ja CGI-ohjelmointi jatkuu ja 1. viikkotehtävä - Luento 4
- Luentotaltiointi
- Viikkotehtävä
- WWW-lomakkeet
- HTTP (HyperText Transfer Protocol)
- Python cgi-kirjasto
- Sanakirja (dict)
- Monikot (tuple)
- Joukko (set)
Jatketaan Pythonin perusteiden ja CGI-ohjelmoinnin parissa. Lisäksi käydään läpi ensimmäinen viikkotehtävä.
Luentotaltiointi
- sovellukset04.wmv 65M
- sovellukset04.avi 203M
- sovellukset04.mp3 32M
Viikkotehtävä
Virheitä:
- radiobuttonilla ei oletusarvoa
- xhtml-deklaraatiossa on virhe
- vasen palkki valuu sisältöosan päälle
- labeleja puuttuu
- oikea palkki menee keskiosan alle liian aikaisin
- css-määrityksiä xthml-dokumentissa
- ei ole osattu käyttää optgroupia
- fonttikokoa on pienennetty
- taulukkotaittoa
- i-elementtiä käytetty
- radiobuttonit eivät toimi
- labelit eivät toimi
WWW-lomakkeet
- Selainohjelma pyytää palvelimelta lomakesivun HTTP-protokollan mukaisilla otsikkotiedoilla.
- Palvelin vastaa selaimelle HTTP-protokollan mukaisilla otsikkotiedoilla, jonka jälkeen tarjoaa WWW-sivun datan (=XHTML:ää).
- Käyttäjä täyttää ja hyväksyy lomakkeen. Selain lähettää lomakkeen tiedot WWW-palvelimella suoritettavalle ohjelmalle.
- Lomakkeella oleva data käsitellään ohjelman tekijän haluamalla tavalla.
- Ohjelma palauttaa käyttäjälle virheilmoituksen tai ilmoituksen onnistumisesta, esim. lomakkeen korjauspyynnöillä tai tulossivun.
Lomakkeen käsittely
- Lomaketiedot tulevat GET- tai POST-metodilla.
- GET = lomaketiedot lisätään osoitteen loppuun.
- POST = tiedot lähetettään HTTP-pyynnön runko-osassa.
- Käytä GET-metodia tilaa muuttamattomissa pyynnössä, joista voidaan tehdä kirjanmerkki, kuten esim. haut. Lisäykset, poistot, päivitykset ja paljon dataa lähettävät lomakkeet POST-metodilla.
- Ohjelma käsitellään yleensä jonkinlaisella tulkilla.
- Ohjelma saa tarvittavat lomaketiedot ja palvelintiedot ohjelmointikielen ympäristömuuttujista.
- Tulkki saa nämä tiedot palvelinohjelmalta. Palvelinohjelman ja skriptikielten välinen rajapinta on määritelty CGI-spesifikaatiossa.
- Skriptitulkki on usein integroitu palvelinohjelmistoon.
- Huomaa, että HTTP on oletuksena tilaton. Emme tiedä edellisistä pyynnöistä tai lomakkeiden käsittelyistä mitään.
HTTP (HyperText Transfer Protocol)
HTTP on protokolla, jonka avulla selain ja WWW-palvelin keskustelevat.
Firefox-selaimen ja WWW-palvelimen välistä HTTP-liikennettä on helppo seurata Tamper Data -laajennuksella.
Selain lähettää WWW-palvelimelle pyynnön:
GET /sovellukset/testi.html HTTP/1.1 Connection: keep-alive Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Accept-Encoding: gzip,deflate Accept-Language: en-us,en;q=0.5 Host: appro.mit.jyu.fi Referer: http://appro.mit.jyu.fi/ User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Keep-Alive: 300
GET /sovellukset/testi.html HTTP/1.0 | Pyydetään informaatiota (GET), jonka osoite palvelimella on /sovellukset/testi.html käyttäen HTTP/1.1-protokollaa. |
Connection: keep-alive | Käsketään pitää yhteys päällä. |
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng, image/png, image/jpeg, image/gif;q=0.2, */*;q=0.1 | Luetellaan selaimen ymmärtämät mediatyypit. Kerrotaan myös mitä mediatyyppejä suositaan q-arvojen avulla. |
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 | Luetellaan kelpaavat merkistöt. |
Accept-Encoding: gzip,deflate | Luetellaan tuetut koodaustavat (pakkaus). |
Accept-Language: en-us,en;q=0.5 | Halutut kielet |
Host: appro.mit.jyu.fi | Palvelimen nimi |
Referer: http://appro.mit.jyu.fi/ | Osoite, josta ollaan tulossa (sivu, jolla olevaa linkkiä on klikattu). |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 | Selaimen tiedot |
Keep-Alive: 300 | Kertoo kuinka monta sekuntia yhteyttä pidetään yllä. Vain HTTP/1.0-protokollassa,
mutta käytetään yhteensopivuussyistä. Oikeastaan muoto pitäisi olla Keep-Alive: parametri=arvo . |
Palvelin vastaa:
HTTP/1.1 200 OK Connection: close Date: Tue, 06 Apr 2004 10:53:18 GMT Accept-Ranges: bytes ETag: "2da29-2147-4044819d" Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) PHP/4.1.2 mod_perl/1.26 Vary: Accept Content-Length: 414 Content-Type: application/xhtml+xml; charset=iso-8859-1 Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" > <head> <title>Testisivu</title> <link href="testi.css" rel="StyleSheet" type="text/css" /> </head> <body> <h1>Testiotsikko</h1> <p>Testitekstiä</p> </body> </html>
HTTP/1.1 200 OK | Statuskoodi - kaikki kunnossa. |
Connection: close | Palvelin sulkee yhteyden. Normaalisti yhteys on pysyvä (persistent), jotta selain voi tehdä useita pyyntöä (kuvat, css, javascript jne.). |
Date: Tue, 06 Apr 2004 10:53:18 GMT | Päivä ja aika, koska vastaus on lähetetty. |
Accept-Ranges: bytes | Sallitaan tavuina määritellyt pyynnöt joissa halutaan vain osa dokumentista. |
ETag: "2da29-2147-4044819d" | Tunniste. Tunniste muuttuu dokumenttia muutettaessa. |
Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) AxKit/1.62 mod_python/2.7.8 Python/1.5.2 mod_ssl/2.8.12 OpenSSL/0.9.6b DAV/1.0.3 PHP/4.1.2 mod_perl/1.26 mod_throttle/3.1.2 | WWW-palvelimen tiedot |
Vary: Accept-Encoding | Vaihteleeko pyydetty resurssi jonkun ehdon mukaan. Tärkeä tieto esim. välimuisteille. Accept-Encoding: esim. erilainen pakkaus. Accept-Language: tarjolla useita kieliversioita. User-Agent: sivun sisältö riippuu selaimesta. |
Content-Length: 414 | Sisällön koko |
Content-Type: application/xhtml+xml; charset=iso-8859-1 | Mediatyyppi ja merkistö |
Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT | Milloin viimeksi muutettu. |
HTTP-otsikoita voi tutkia tarkemmin esim. seuraavilla ohjelmilla:
- Tamper Data -laajennos Firefoxiin
- Web-Sniffer
HTTP Status Codes
Palvelin palauttaa vastauksessa HTTP-statuskoodin, joka kertoo lyhyesti selaimelle miten pyyntö onnistui ja miten tulee jatkossa toimia. Listassa yleisimmät:
- 200 OK
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 401 Unauthorized Access
- 403 Forbidden
- 404 Not Found
- 406 Not Acceptable
- 408 Request Time-out
- 500 Internal Server Error
Lisätietoa
Python cgi-kirjasto
HTML:n erikoismerkit (<, > ja &) pitää muistaa koodata entiteeteiksi. Apuna voi käyttää cgi.escape-metodia. Attribuuttien arvot voi koodata xml.sax.saxutils.quoteattr-metodilla.
URLien kielletyt merkit voi koodata urllib.quote-metodilla.
Sanakirja (dict)
Pythonissa on myös erittäin kätevä tietotyyppi dict eli sanakirja jota muissa ohjelmointikielissä kutsutaan mm. assosiatiiviseksi taulukoksi. dict-tietotyyppi on siis järjestämätön taulukko jossa alkioihin viitataan uniikeilla avaimilla.
>>> testi = dict([[1,2], [2,2], ['kolme',3], ['neljä',4]]) >>> testi {'nelj\xe4': 4, 1: 2, 2: 2, 'kolme': 3} >>> for x in testi.keys(): print x ... neljä 1 2 kolme >>> for x in testi.keys(): print testi[x] ... 4 2 2 3 >>> testi['kolme'] 3 >>> testi[2] 2 >>> testi[1] 2
Monikot (tuple)
Monikko eli tuple on listaa vastaava tietorakenne, jonka sisältöä ei voi muuttaa.
a = (1,2,3,"testi") print a a=[0] # ei onnistu
Joukko (set)
Pythonin erikoisempiin tietotyyppeihin kuuluu set eli joukko. Joukko ei voi sisältää duplikaatteja ja siihen voi soveltaa joukko-opin operaatioita kuten yhdiste, leikkaus, erotus jne.
>>> lista = ['tommi', 'antti', 'ville', 'tommi'] >>> joukko = set(lista) >>> joukko set(['ville', 'antti', 'tommi']) >>> 'tommi' in joukko True >>> 'kalle' in joukko False >>> joukko2 = set(['joonas','antti','kalle']) >>> joukko2 set(['joonas', 'kalle', 'antti']) >>> joukko - joukko2 #henkilöt joukosta jotka eivät ole joukko2:ssa set(['ville', 'tommi']) >>> joukko & joukko2 #henkilöt jotka ovat molemmissa joukoissa set(['antti']) >>> joukko ^ joukko2 #henkilöt jotka ovat jommassa kummassa joukossa mutta eivät molemmissa set(['joonas', 'kalle', 'tommi', 'ville']) >>> joukko | joukko2 #henkilöt jotka ovat jommassa kummassa joukossa set(['ville', 'joonas', 'kalle', 'antti', 'tommi'])
Käyttäjien kommentit