mod_python

Luennolla käydään läpi mod_pythonin perusteet ja tutustutaan apache-www-palvelimen ominaisuuksiin.

Luentotaltiointi

Ongelmia videon katselussa?

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:

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.

esimerkki 1 - Multiviews

Lisätään tiedostoihin kieltä koskeva pääte:

index.html.en
index.html.fi
index.html.fr

esimerkki 2 - Typemaps

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:

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

virhemalli (lähdekoodi)

moduulit

Apache 2.2 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

lomake.html

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

Kommentoi Lisää kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/web-sovellukset/luennot/luento7/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2016-01-13 18:18:54
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta