09.02.2008 Python na webu 3.díl (Teng Template Engine)

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:

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.

Komentáře (2)

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