16.02.2008 Python na webu 4.díl (jak efektivně využít mod_python)

V tomto díle už budu aplikaci stavět na trošku jiném základě. Nastal čas docela rázně pokročit dále. Všechny předcházející informace jsou užitečné, sloužily k objasnění základů a jsou hodně detailní a je na nich vystavěn balíček, který bude sloužit pro dispatching url, a který umí všechno, co bude potřeba.

Jedná se o adresář se třemi soubory, jejichž použití je velice jednoduché. Po stažení umístěte balíček někam, kde k němu bude mít aplikace přístup. Máte několik možností. Buď si jej nakopírujete do /usr/lib/python2.4/site-packages/, v tom případě k němu budou mít přístup všechny aplikace. Nebo si jej nakopírujte přímo k aplikaci do ~/blog/src/, v tom případě k němu bude mít přístup jenom ta jedna aplikace, ke které ho nakopírujete. Každopádně bude potřeba změnit v konfiguraci apache sekci nějak takto:

# document root directory
<Directory /home/uzivatel/blog/src>
    SetHandler python-program
    PythonHandler mp_publisher.publisher
    PythonDebug On
    PythonAutoReload On
</Directory>

Co dál. Nyní budete potřebovat vytvořit jeden soubor s názvem dispatch.py, soubor uložíme do ~/blog/src a bude v něm uložena základní konfigurační tabulka. A dále upravíme soubor index.py. dispatch.py a index.py by měly vypadat nějak takto:

# soubor dispatch.py
import mp_publisher as mp

# switch enable / disable regexp. url for match req.uri
regExpUrl = True

# application url
url = {
    # test url
    "^/test$" : ("index.test", mp.PARSE, (), ),
}
# soubor index.py
from mod_python import apache

def test(req):
    req.content_type = "text/html"
    req.write("Ahoj, jsem v metode test")
    return apache.OK
#enddef

Nyní restartneme server:

~/blog/src/blog.sh

A vyzkoušíme http://localhost:8000/test. V prohlížeči by jste měli vidět nápis Ahoj, jsem v metode test. Pokud se tak stalo, máte vyhráno. Pokud ne, mod_python vám řekne, kde jste udělali chybu. Nyní si ještě vyzkoušejte přidat do url nějaké hodnoty např.: http://localhost:8000/test?a=1&a=2&b=Ahoj a nechat si je vypsat.

~/blog/src/blog.sh
# soubor index.py
from mod_python import apache

def test(req):
    req.content_type = "text/html"

    a = req.form.getlist("a", int)
    b = req.form.getfirst("b", str, "")

    req.write("a: %s<br>" % a)
    req.write("b: %s<br>" % b)

    return apache.OK
#enddef

Co se to vlastně stalo. V souboru dispatch.py je tabulka, jejíž klíč je regulární výraz, který se bude aplikovat na url, pokud nastane shoda, použije se hodnota klíče "^/test$" ("index.test", mp.PARSE, (), ). index.test znamená, že se pro zpracování requestu použije metoda test, ze souboru index.py. Další část mp.PARSE znamená, že se hodnoty z requestu budou parsovat a budou přístupné v objektu req.form. Na místo konstanty mp.PARSE můžeme napsat tyto hodnoty:

Pozn.: asi to jestě předělám ...

Bindování hodnot do předaného objektu si ukážeme na příkladu. Soubor dispatch.py upravíme takto:

# soubor dispatch.py
import mp_publisher as mp

# switch enable / disable regexp. url for match req.uri
regExpUrl = True

# application url
url = {
    # test url
    "^/test$" : ("index.test", mp.PARSE_BIND, ("index.BindObject", ), ),
}

Soubor index.py upravíme takto:

# soubor index.py
from mod_python import apache

def test(req):
    req.content_type = "text/html"
    req.write("Vypis objektu req.bind:<br>")
    req.write("Typ: %s<br>" % str(req.bind).replace("<","&lt;").replace(">", "&gt;"))
    req.write("Cleny: %s<br>" % str(req.bind.__dict__))
    return apache.OK
#enddef

class BindObject:
    def __init__(self):
        self.a = None
        self.b = ""
        self.c = []
    #enddef
#endclass

Nyní je potřeba restart serveru. Restart je nutný i přesto, že máme v konfiguraci apache nastaveno PythonAutoReload On, a to z důvodu, že v dispatch.py jsou requlární výrazy. Ty se při prvním přístupu na proces kompilují, což výrazně urychluje celý proces hledání url, která odpovídá requestu. Nyní vyzkoušíme url http://localhost:8000/test?a=1&b=Ahoj&c=svete. Takže nyní máme vše, co přislo z formuláře pěkně nastavené v objektu. Pokud by se v requestu vyskytl atribut, který není přítomen v objektu, nebude do objektu nastaven, ale bude přístupný přes req.form.

Objekty můžeme libovolně zanořovat a skupit do listu, k indentifikaci příslušnosti se pak používá tečka. Např. user.id=1 nastaví do objektu user vlastnost id na 1.

Všechny dosavadní příklady si můžete stáhnout zde a klidně si je upravte jak se vám zlíbí. Těm, kteří se rozhodnou něco zkusit přeji hodně štěstí.

Komentáře (0)

© 2008. Weblog nejen o práci. www.Karotka.cz. Rss    Google Pagerank - www.karotka.czGoogle Pagerank S-Rank - www.karotka.czS-Rank