Python perusteet ja CGI-ohjelmointi

Näissä tehtävissä tutustutaan Pythonin ja CGI-ohjelmoinnin perusteisiin.

Halavassa, Jalavassa ja

users.jyu.fi-palvelimessa on käytössä Python 2.7. Tämän tehtä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.
...
...
...

Hello World

Käy ensimmäisenä läpi Python 2.7 tutoriaali.

  1. Luo haluamallasi editorilla hello.cgi-tiedosto ja tallenna se W-asemasi juureen cgi-bin/-kansioon.

    Huomaa, että käyttämäsi editorin täytyy osata tallentaa tekemäsi tiedosto käyttäen unix-muotoisia rivinvaihtoja eikä windows-muotoisia. Notepad++ näyttää ikkunan alalaidassa rivinvaihtojen tyypin ja sen voi vaihtaa valinnalla Edit|EOL Conversion|Unix/OSX Format.

  2. Notepad++:ssa kannattaa myös muistaa valita käytetty kieli (Python) Language-valikosta, koska Notepad++ ei suoraan .cgi-tiedostopäätteestä pysty sitä päättelemään.
  3. Luo kansio tarvittaessa. HUOM! Kansion täytyy ehdottomasti olla w:\cgi-bin eikä mikään muu. kts. CGI/SSI-tekniikat users.jyu.fi-palvelimella
  4. Kopioi ohjelmasi pohjaksi seuraava koodi:
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    print u"Hello world"
    

    Huom! Merkitse aina kaikki merkkijonot unicode-merkkijonoiksi u-etuliitteellä

  5. Kokeile ohjelman toimintaa komentorivillä jalava/halava-koneessa.

    Putty-pääteohjelmassa voit kopioida tekstiä leikepöydälle maalaamalla tekstin hiiren vasemmalla painikkeella. Liittäminen tapahtuu hiiren oikealla painikkeella tai SHIFT-INSERT-näppäinyhdistelmällä.

    Toimiakseen ohjelma vaatii suoritusoikeuden (execute) kaikille käyttäjille. Lisäksi ohjelman ryhmän (group) täytyy olla users

    [tjlahton@halava cgi-bin]$ chmod a+x hello.cgi
    [tjlahton@halava cgi-bin]$ chgrp users hello.cgi
    [tjlahton@halava cgi-bin]$ ls -al hello.cgi
    -rwxr-xr-x. 1 tjlahton users 3777 Feb  5 09:59 hello.cgi

    Cgi-ohjelmaan sekä samaan kansioon EI SAA olla kirjoitusoikeutta muilla kuin käyttäjällä itsellään.

    Jos edellämainitut asiat ovat kunnossa voit kokeilla suorittaa ohjelmasi:

    [tjlahton@jalava cgi-bin]$ ./hello.cgi 

    Seuraava virhe tarkoittaa, että rivinvaihdot ovat DOS-tyyppisiä vaikka pitäisi olla Unix-tyyppisiä:

     usr/bin/python^M: bad interpreter: No such file or directory

    Varmista, että editorisi käyttää unix-tyylisiä rivinvaihtoja. Visual Studio Codessa rivinvaihto näkyy alalaidan statusbarissa joko muodossa CRLF tai LF. Oikea muoto on LF. Varmista myös, että tiedostosi alussa ei ole UTF-8:aan liittyvää BOM-merkintää.

Hello world -selaimessa

Edellä toteutettu hello world -ohjelma toimii komentoriviltä mutta sitä ei voi vielä käyttää selaimella. Toimiakseen oikeana CGI-ohjelmana täytyy ohjelman tuottaa HTTP-protokollan edellyttämät tulosteet.

Muuta ohjelma seuraavanlaiseksi:

Ensimmäisenä rivinä on unix-ympäristön edellyttämä shebang-rivi, joka kertoo mistä käytettävä tulkki löytyy. Toinen rivi on vasta varsinaisesti python-kieltä ja kertoo millä merkistöllä ohjelmakoodi on kirjoitettu. Käytä aina UTF-8-merkistöä.

#!/usr/bin/python
# -*- coding: utf-8 -*-

# import-komennolla voidaan ladata käyttöön kirjastoja
import cgitb
# seuraava rivi aktivoi cgitb-kirjaston, joka osaa heittää virheilmoitukset www-sivulle
# näkyville. Ilman tätä virheet menevät www-palvelimen lokiin jonne ei tavallisella
# käyttäjällä ole pääsyä. Tämä ei kuitenkaan auta jos content-type-otsake on väärin...
# Jos testaa ohjelmaa komentoriviltä niin seuraava rivi kannattaa kommentoida pois käytöstä
cgitb.enable()

# http-protokolla edellyttää vähintään content-type-otsaketta, jossa kerrotaan
# mikä on kyseisen sivun/dokumentin/tiedoston MIME-tyyppi ja tiettyjen tyyppien
# yhteydessä mikä on käytetty merkistö
# HTTP-otsakkeiden jälkeen tulee tyhjä rivi, jonka jälkeen alkaa varsinainen
# dokumentti. Tässä tapauksessa tuotetaan pelkkää tekstiä
# Pythonissa voi tulostaa monen rivin merkkijonoja """ """ -merkintöjen välissä
print u"""Content-type: text/plain; charset=UTF-8

Hello world!
"""

Jos ohjelmasi toimii moitteetta komentoriviltä voit kokeilla sitä nyt selaimella osoitteesta:

http://users.jyu.fi/~omatunnus/cgi-bin/hello.cgi

Jos ohjelma ei toimi selaimella eli saat server errorin niin tarkista tietohallintokeskuksen ohje CGI/SSI-tekniikat. Yleensä vikana on, että ohjelman ja kansion ryhmät eivät ole samat. Yleensä ryhmänä pitää olla users.

Kokeile pelkän "hello world"-tekstin sijaan tulostaa html-dokumentti. Huomaa, että sinun pitää myös muuttaa content-type-otsakkeesta tyypiksi "text/html". Kokeile mitä eroa on eri content-typen arvoilla. Kokeile myös tyyppiä "application/octet-stream".

Python

Muuta ohjelmasi tulostamaan html-koodia niin saat mahdolliset cgitb-kirjaston tulostamat virheilmoitukset nätisti näkyville selaimeen.

HUOM! Pythonissa lohkot merkitään sisentämällä! Sama sisennystaso tarkoittaa siis samaa lohkoa. Varmista, että editorisi korvaa tabulaattorimerkit neljällä välilyönnillä. Käytä sisennyksessä neljää välilyöntiä. Notepad++:ssa tämä asetus löytyy kohdasta Settings|Preferences|Language

Käytä vain unicode-merkkijonoja eli merkitse kaikki ohjelmakoodiin kirjoittamasi merkkijonot u-etuliitteellä esim. u'Tämä on unicode-merkkijono'.

Lisää ohjelmasi alkuun seuraava tietorakenne:

data = [
        { u'nimi': u'Kalle',
          u'ammatti': u'Yliopistonopettaja',
          u'syntymävuosi': 1980,
          u'palkka': 2000
        },
        { u'nimi': u'Ville',
          u'ammatti': u'Opiskelija',
          u'syntymävuosi': 1995,
          u'palkka': None
        },
        { u'nimi': u'Maija',
          u'ammatti': u'Professori',
          u'syntymävuosi': 1970,
          u'palkka': 3000
        }
]

Avaa Python tutorial ja toteuta sen avulla seuraavat asiat:

Käyttäjien kommentit

Kommentoi Lisää kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/tiea2080/ohjaus/ohjaus1/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2018-01-11 11:32:02
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta