Tak jako např. Java poskytuje pro zobrazení JSP, je možné v Pythonu použít PSP. Je to jedna z mnoha cest, které se však v tomto článku věnovat nebudu :-). Jako cestu pro oddělení aplikační a prezentační části jsem si zvolil Teng Template Engine.
Teng má několik charakteristických vlastností, z nichž některé můžou být v jistých případech kladem i záporem celého systému. Celkově však převažují klady. Uvedu je proto dohromady:
- rychlost
- jednoduchost
- extense pro PHP, C++ a Python se stejnou syntaxí
- nemožnost v něm programovat
- má pouze jeden datový strom
- přehlednost v používaných datech
- multijazyčnost
- nemožnost jednoduchého rozšíření o další tagy a funkce
Ačkoliv se to může zdát omezující, hlavně z pohledu někoho kdo používá třeba JSTL, věřte že nic z toho, co se vám může zdát jako překážka ve skutečnosti překážka není. Ještě dodám, že Teng je nástroj, který pochází z programátorské dílny www.seznam.cz.
Aby jsme mohli v Pythonu Teng použít, je třeba si jej zkompilovat. Zdrojáky doporučuji stáhnout přímo z cvs, je tam vždy ta nejaktuálnější verze. Po nainstalování všech důležitých knihoven a nástrojů, které budou potřeba (flex, bison), můžeme vykompilovat základní knihovnu. Následující sekvence příkazů vytvoří balíček libteng2 a libteng2-dev (+ verze a přípona podle použité architektury).
cvs -z3 -d:pserver:anonymous@teng.cvs.sourceforge.net:/cvsroot/teng co . cd teng/debian ./make.sh dpkg -i pkg/libteng*
Po nainstalování se můžeme pustit do kompilace extension pro Python. Následující sekvence příkazů vytvoří balíček python2.4-teng (+ verze a přípona podle použité architektury).
cd python/debian/ ./make.sh dpkg -i pkg/python2.4-teng*
Po instalaci můžeme Teng naimportovat, nainicializovat a používat. V prvním jednoduchém příkladě prozkoumáme základní objekty Tengu a vypíšeme je do stránky. Jejich použití je zřejmé již podle jména. Vyzkoušejte tento skript podle návodu v prvním díle seriálu.
from mod_python import apache
from teng import Teng
def handler(req):
req.content_type = "text/html"
req.write("<b>Metody objectu teng:</b><br>")
# inicializace
teng = Teng()
for member in dir(teng) :
req.write("%s<br>" % member)
#endfor
req.write("<br><b>Metody objectu dataRoot:</b><br>")
# vytvoreni datoveho stromu
dataRoot = teng.createDataRoot({})
for member in dir(dataRoot) :
req.write("%s<br>" % member)
#endfor
return apache.OK
#enddef
Jak již jsem psal, Teng má pouze jedinný datový strom a ten se vytváří metodou createDataRoot(), jejíž jediný parametr je slovník hodnot, které chceme přidat přímo do rootu stromu. Do stromu se pak postupně přidávají data, ze kterých se pak přes šablonu vytvoří konečný výstup metodou generatePage. Html šablony budu ukládat do adresáře template. Následuje úplně minimální příklad toho, jak se Teng používá:
from mod_python import apache
from teng import Teng
def handler(req):
req.content_type = "text/html"
# inicializace
teng = Teng()
dataRoot = teng.createDataRoot({
"najakaRootPromenna" : "jeji hodnota"})
# pridame data do stromu poprve
dataRoot.addFragment("baseFragment", {
"klic1" : "hodnota 1",
"klic2" : "hodnota 2"})
# pridame data do stromu jeste jednou
dataRoot.addFragment("baseFragment", {
"klic1" : "hodnota 1",
"klic2" : "hodnota 2"})
# vygenerujeme stranku s pouzitim sablony index.html
teng.generatePage(
"/home/uzivatel/blog/template/index.html",
data = dataRoot,
outputFile = req )
del dataRoot
return apache.OK
#enddef
Šablona by mohla vypadat nějak takto:
Najaka root promenna: ${najakaRootPromenna} <br><br>
<?teng frag baseFragment?>
Klic 1: ${klic1} <br>
Klic 2: ${klic2} <br>
Radek: ${_number} <br>
<?teng if $_number == 0?>
<br>
<?teng endif?>
<?teng endfrag?>
Metoda generatePage má několik nepovinných kw parametrů, jeden z nich je i umístění konfiguračního souboru. Kompletní zápis by mohl vypadat třeba takto:
res = teng.generatePage(
template,
data = dataRoot,
contentType = "text/html",
encoding = "UTF-8",
configFilename = "/home/uzivatel/blog/template/blog.conf",
dictionaryFilename = "/home/uzivatel/blog/template/blog.dict",
outputFile = req)
V konfiguraci si můžete definovat globální proměnné, ke kterým pak máte v šablonách přístup přes #{jmeno_promenne}. Další velice pěkná věc je výpis datového stromu přímo do šablony. To se provádí tak, že stačí do konfigurace napsat: %enable debug a do šablony přidat řádek <?teng debug?>. Vypnutí se pak provádí přes %disable debug. Konfigurační soubor by mohl vypadat třeba takto:
WEB_URL http://www.karotka.cz %enable debug %disable errorfragment %disable logtooutput
Za zmínku stojí i slovník (k jeho hodnotám se přistupuje stejně jako ke konfiguračním hodnotám přes #{klic}), což je textový soubor, který může vypadat třeba takto:
addcomment Příspěvky ke článku title Titulek content Obsah
Kompletní manuál, co a jak je možné nalézt na této stránce. Bohužel se v manuálu neprojevil poslední vývoj a spousta věcí není aktualizována. Aktuálnější je neoficiální teng.olmik.net. Další užitečné informace budou k nalezení v některém z dalších dílů a samozřejmně v posledním, kde budou kompletní zdrojáky blogu.
