přejít na obsah přejít na navigaci

Linux E X P R E S, Webové aplikace v Pythonu, 2. část

Soutěž - reproduktory Trust

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ě.


reklama

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.

Nahoru

Odkazy

Top články z OpenOffice.cz

Přidat téma diskuse

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Lukáš Zapletal

Lukáš Zapletal

Senior Software Engineer @ Red Hat


  • Distribuce: Fedora

| blog


Redakční blog

Redakce

Redakce, 21. prosinec

Pište pro LinuxEXPRES

Baví vás Linux? Pište o něm, není to nic těžkého. LinuxEXPRES hledá nové autory.


Pavel Fric

Pavel Fric, 23. říjen

Nové motivy pro přehrávač Sayonara

Pomozte rozšířit možnost měnit vzhled programu za běhu


Pavel Fric

Pavel Fric, 28. únor

Lollypop


Všechny blogy »