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
# 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:
- mp.PARSE - provede se zparsování formuláře
- mp.PARSE_BIND - provede se zparsování formuláře a hodnoty se nastaví do předaného objektu. Zápis by vypadal např. takto: ("index.test", mp.PARSE, (module.Object, ), ). Object musí mít hodnoty, které se mají nastavit definované
- mp.PARSE_CHECK - provede se zparsování formuláře a vytvoří se objekt, který se definuje v dispatch souboru jako checkObject = "module.Object", který se dá použít např.: pro ověření přihlášeného uživatele.
- mp.PARSE_BIND_CHECK - je kombinace PARSE_BIND a PARSE_CHECK
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("<","<").replace(">", ">"))
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í.
