Linux E X P R E S

Facebook

Webové aplikace v Pythonu, 2. část

Příklad v minulé části vracel handler při každém požadavku končícím na .py stejný výsledek - "Hello World". K čemu nám je ovšem takový handler vracející pokaždé stejné výsledky? Správná otázka, odpověď je nasnadě.


Handler samotný si může adresu požadavku přečíst a podle toho se zachovat (a vracet něco jiného). Takže se nabízí otázka napsat handler, který by prostě a jednoduše načetl modul pythonu, jehož jméno a cestu k němu by zjistil z části adresy, a spustil jej.

Takový handler však nemusíme psát vlastní, součástí mod_pythonu je handler publisher, který navíc přidává mnoho dalších věcí (např. cachování přeložených modulů pro zvýšení rychlosti, opětovné načítání změněného skriptu, pokud je nastaven PythonAutoReload). U tohoto handleru se zadává do adresy nejen cesta k souboru, ale také funkce, která požadavek zpracuje. Například pro adresu /test/path/hello.py/say načte soubor path/hello.py a spustí funkci say. Ta musí přijímat odkaz na proměnnou request a vrátit výsledek.

O handlerech se zmiňuji zejména proto, že umožňují napsat si vlastní způsob zpracování požadavku. Můžete mít handler, který bude například volat metody různých objektů v závislosti na tvaru URL (podobně jako publisher) nebo handler, který bude pouze transformovat XML dokumenty na XHTML a podobně. Možnosti nasazení mod_pythonu jsou vskutku široké.

Pokud byste chtěli mod_apache použít pro vývoj webových aplikací, nabízí veškerý komfort. Poskytuje funkce a třídy pro ukládání sezení, práci s cookies a dokonce nabízí vlastní systém vkládání kódu Pythonu do HTML - PSP. V rámečku uvádím malou ukázku jednoduché MVC architektury pomocí mod_pythonu. Soubor comment.py je v tomto případě kontroller, modelem je zde třída Comment (tuto doménovou třídu pro zkrácení nedefinuji) a Dao (podle návrhového vzoru DAO - Data Access Object). Soubor read.html představuje jednoduchou PSP šablonu, tedy třetí prvek architektury MVC - View.

Část souboru comment.py:
def read(req, article):
global __mtime__
__mtime__ = 0
dao = Dao()
coms = dao.listComments(article)
p = psp.PSP(req, filename="templates/test.html")
p.run({"comments": coms, "article": article})
return ""
Šablona v PSP - read.html:
<%@ include file="head.html"%>
<%
for c in comments:
# begin
%>
<%= c.body %>
<%
# end
%>

Metoda read souboru comment.py zpracuje požadavek, na vstupu očekává parametr article (URL tedy musí být například tvaru comment.py/read?article=1). Je vytvořen DAO objekt, metoda vyhledá komentáře a vrací je v kolekci. Tato kolekce je vsazena do jmenného prostoru PSP stránky a PSP stránka je vyrenderována a vrácena klientovi. Metoda run zapisuje do objektu response přímo, není tedy v posledním příkazu co vracet.

Syntaxe PSP je jednoduchá, symboly % představují bloky kódu v Pythonu, symbol %= pak umožňuje provést jeden příkaz a jeho výstup vložit do stránky. Třetí symbol (%@) je určen ke vkládání jiných souborů. Víc toho PSP neumí, ale musím upozornit na jednu zvláštnost - odsazení. Jistě jste si všimli komentářů begin a end, které jsou náležitě odsazeny (jeden tabelátor, případně pevně daný počet mezer v celém souboru). Pokud byste chtěli příkazy Pythonu vnořovat, musíte udržovat správné odsazení, a proto se zde uvádějí (nepovinné) komentáře, aby na ně programátor nezapomněl. Jde to i bez nich.

Stránky PSP jsou nejprve přeloženy na pythonovský objekt (resp. funkci), zkompilovány a uloženy v cache (její velikost se dá nastavit), takže další požadavky jsou již velmi rychlé. Celý mod_python se vyznačuje vysokým výkonem a ve spojení se serverem Apache dosahuje výborných výsledků. Samotný analyzátor PSP stránek je navíc napsán v jazyce C za pomoci flexu, takže překládání při prvním dotazu ani nepostřehnete.

Diskuze (0) Nahoru