mod_python - Luento 5
Luennolla käydään läpi mod_pythonin perusteet ja tutustutaan apache-www-palvelimen ominaisuuksiin.
Luentotaltiointi
- sovellukset05.avi 191M
- sovellukset05.mp3 32M
- sovellukset05.wmv 44M
Apache
Apache on maailman käytetyin www-palvelin-ohjelmisto.
.htaccess
Tavallinen käyttäjä voi vaikuttaa apachen toimintaan .htaccess-tiedostoilla. Jos mahdollista niin kannattaa ennemmin käyttää palvelimen pääasetustiedostoja kuin .htaccess-tiedostoja.
.htaccess-tiedoston voi luoda mihin kansioon tahansa ja sen sisältämät asetukset vaikuttavat tähän kansioon ja kaikkiin sen alikansioihin.
.htaccess-tiedostoja käytetään esim. seuraaviin:
- autentikointi
- Server Side Includes (SSI)
- CGI
- Suodattimet
- Käsittelijät
- Automaattinen sisällön valinta
- Oletusmerkistö ja -mediatyyppi
- Omat virheilmoitukset
- Edelleenohjaus
- mod_rewrite
Salasanasuojaus
Sijoita suojattavassa kansiossa olevaan .htaccess-tiedostoon rivit:
AuthUserFile /foo/bar/tunnus/.users AuthGroupFile /dev/null AuthName ByPassword AuthType Basic <Limit GET> require valid-user </Limit>
AuthUserFile-kohtaan annettava polku on oltava www-palvelimella toimiva ja sen on osoitettava salasanatiedostoon. Oikean polun voi tarkistaa users.jyu.fi-koneessa.
Salasanan ja käyttäjätunnuksen voi luoda komennolla:
htpasswd .users tunnus
Jos .users-tiedosto luodaan ensimmäistä kertaa tai tyhjennetään niin rivin on oltava muotoa:
htpasswd -c .users tunnus
Automaattinen kielivalinta (content negotiation)
Apache mahdollistaa automaattisen kielivalinnan käyttäjän selaimen asetuksien perusteella.
Lisätään tiedostoihin kieltä koskeva pääte:
index.html.en index.html.fi index.html.fr
DirectoryIndex index.var index.html LanguagePriority fi en AddHandler type-map .var AddType application/xhtml+xml .xml
index.var-tiedosto:
URI: index.html.fi Content-Language: fi Content-Type: text/html URI: index.html.en Content-Type: text/html Content-Language: en
SSI (Server Side Includes)
SSI-komennot ovat HTML-dokumenttiin upotettuja käskyjä joilla voidaan tulostaa muuttujien arvoja tai suorittaa ohjelmia
ATK-keskuksen www-palvelimessa SSI-komentoja sisältävien tiedostojen
pääte pitää olla .shtml
Palvelinta voi käskeä tulkitsemaan SSI-komennot mistä tahansa tiedostoista määräämällä:
AddHandler server-parsed .html
Kertoo dokumentin muutosajankohdan:
<!--#echo var="LAST_MODIFIED"-->
Lisää tähän kohtaan dokumenttia tiedoston linkit.ssi sisällön:
<!--#include virtual="linkit.ssi"-->
Esimerkki: pohja.txt
Lisätietoja SSI:stä löytyy osoitteista:
- http://www.apache.org/docs/mod/mod_include.html
- http://www.mit.jyu.fi/opiskelu/seminaarit/ohjelmistotekniikka/cgi/#Heading13
Edelleenohjaus
Edelleenohjaus tehdään HTTP:n location-komennolla. Apachesta löytyy suoraan valmiit komennot tätä varten. Edelleenohjausta EI PIDÄ TEHDÄ käyttämällä väliaikaisia www-sivuja ja niihin tehtyjä epästandardeja virityksiä!
Pysyvä edelleenohjaus:
Redirect permanent /tt-appro/index.html http://appro.mit.jyu.fi/
Väliaikainen edelleenohjaus:
Redirect /tt-appro/index.html http://appro.mit.jyu.fi/
Monimutkaisemmat edelleenohjaukset
RedirectMatch permanent /doc/tietokone/pc.* http://appro.mit.jyu.fi/doc/tietokone/
RedirectMatch permanent /doc/kayttojarjestelma/win.* http://appro.mit.jyu.fi/doc/kayttojarjestelma/
RewriteEngine on
RewriteOptions inherit
RewriteBase /doc/
RewriteRule ^(.*)\.svm $1 [C,E=WasHTML:yes]
RewriteCond %{REQUEST_FILENAME}.jpg -f
RewriteRule ^(.*)$ $1.jpg [S=1]
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.png
Omat virheilmoitukset
.htaccess:
ErrorDocument 404 /~tjlahton/python/virhe.psp
moduulit
mod_python
mod_python mahdollistaa tehokkaan python-ohjelmien integroimisen ja suorittamisen apache-www-palvelimessa. vrt. php ja mod_perl.
Apache-www-palvelin jakaa toimintansa erilaisiin vaiheisiin. Näihin vaiheisiin voi ohjelmoida omat käsittelijät (handlers). mod_pythonin avulla näitä käsittelijöitä voi kirjoittaa pythonilla.
mod_python.publisher
mod_python.publisher on käsittelijä, jonka avulla voi tehdä yksinkertaisia mod_python-sovelluksia
mod_pythonin publisher-handler otetaan käyttöön lisäämällä seuraavat rivit .htaccess-tiedostoon:
AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On
mod_python Apache Configuration Directives
Nyt voidaan kirjoittaa vaikka seuraavanlainen python-ohjelma testi.py:
def index(req): return "Tämä on index" def testi(req): return "Tämä on testi"
Ohjelmaa voidaan nyt testata seuraavista osoitteista:
http://users.jyu.fi/~tjlahton/python/testi.py
http://users.jyu.fi/~tjlahton/python/testi.py/index
http://users.jyu.fi/~tjlahton/python/testi.py/testi
http://users.jyu.fi/~tjlahton/python/testi.py/kukku
Viimeinen osoite antaa virheilmoituksen. ts. python-funktioon voidaan suoraan osoittaa urlin avulla. Jos url osoittaa pelkästään suoraan python-ohjelmaan niin oletuksena suoritetaan index-niminen funktio.
Sivun sisältöä ei pidä enää tulostaa print-lauseilla vaan funktion pitää palauttaa sivun sisältö merkkijonona.
Funktion ainut oletusparametri on req-objekti, joka sisältää erilaisia CGI-ympäristöä vastaavia tietoja. Funktio voi ottaa useampiakin parametreja jolloin parametreina tuodaan vastaavannimisten lomakekenttien tiedot
def index(req, nimi, osoite): a = "Nimesi on %s
" % nimi a += "Osoitteesi on %s" % osoite return a
Jos kyseessä ei olekkaan funktio vaan luokka niin mitään parametreja ei tuoda vaan apache palauttaa suoraan luokan merkkijonomuodossa.
Lomakkeelta tuleviin tietoihin pääsee näppärästi käsiksi ilman funktion-parametrejakin käyttämällä Request-objektia.
def index(req): return req.form #palauttaa FieldStorage-objektin. vrt. cgi-kirjasto
psp - Python Server Pages
AddHandler mod_python .psp .psp_ PythonHandler mod_python.psp
Malli:
<% req.content_type = "text/plain" a = "Testiteksti" %> Tähän voi vapaasti kirjoittaa tekstiä. Tähän tulostuu a-muuttujan arvo: <%=a %>
Oma käsittelijä
.htaccess:
AddHandler mod_python .py PythonHandler myscript PythonDebug On
myscript.py
from mod_python import apache def handler(req): req.content_type = "text/plain" req.write("Oma käsittelijä") return apache.OK
Käsittelijä suoritetaan aina, kun palvelimelta pyydetään jotain .py-päätteistä tiedostoa riippumatta siitä onko kyseistä tiedostoa olemassa vai ei.
Käsittelijän pitää aina lopuksi palauttaa apache.OK jos kaikki meni ok. Jos pyyntöä ei käsitelty ollenkaan voidaan palauttaa apache.DECLINED tai käsittelijä voi palauttaa jonkun HTTP-virheen.
apache-kirjasto
Request-objekti
esimerkki ( lähdekoodi )
CGI-ympäristömuuttujat
keys = os.environ.keys() keys.sort() for k in keys: print k + " " + os.environ[k]
Käyttäjien kommentit