„Pythonovka [Pajtnovka] - Webová stránka, resp. aplikace napsaná v jazyce Python.”
Python - jaké máme možnosti
Provozovat webovou stránku psanou v Pythonu je, i když se to nezdá, vcelku jednoduché. Možností použití je hned několik. Můžeme psát cgi skripty, můžeme použít
mod_python a to hned několika způsoby, nebo můžeme provozovat vlastní webový server napsaný přímo v Pythonu. Pro různé aplikace se hodí různé přístupy. Já se však v tomto článku zaměřím na univerzální přístup, který umožňuje provozovat aplikaci jak samostatně, jako webový server, tak v serveru
Apache přes mod_python. Podrobnější rozbor možností můžete nalézt třeba v
jednom z mých starších článků.
Poor Http nebo Poor Publisher
Při hlubším zkoumání jak v Pythonu napsat webovou aplikaci, která by byla dostupná přes Lighttpd sem nakonec napsal vlastní webový server
Poor Http. I když byl tento server původně navržen jako pattern webové aplikace, umí toho nakonec víc a stal se samostatnou fungující komponentou.
Co tedy umí ? Je konfigurovatelný, umí běžet v režimu single (jednoprocesový, jednovlákonový), forking (multiprocesový), threading(multivláknový). Umí logovat a to jak požadavky (access log), tak chyby (error log). Vedle zavolání příslušné funkce, která obsluhuje konkrétní požadavek umí vrátit i soubor uložený na serveru, například obrázek. Dále umí generovat základní chybové stránky, jako 403, 404, 405, 500 a 501. Jeho API je z důvodů kompatibility co nejvíce podobné API mod_pythonu resp. Apache. Je konfigurovatelný prostřednictvím ini souboru a umí běžet v ladícím i optimalizovaném režimu.
Ke spojení webové aplikace a serveru používá soubor dispatch_table.py, který obsahuje vazbu http požadavků a obslužných funkcí. Dále je v něm možné definovat obsluhu chybových stavů a inicializaci aplikace. Tento soubor stejným způsobem využívá i Poor Publisher, jakožto rozhraní mezi mod_pythonem a webovou aplikací. Obě komponenty, jak Poor Http tak Poor Publisher nepatrně vylepšují FieldStorage, obsahují vlastní ladící obsluhu chyby 500 a definují třídu PoorSession, což je tzv. samonosná cookie.
import http
import application
handlers = {
‚/‘ : (http.METHOD_GET, application.index),
‚/post‘ : (http.METHOD_POST, application.post),
‚/history‘ : (http.METHOD_GET, application.history),
}
Dispatch table aplikace AJAXChat.
SetHandler mod_python
PythonDebug On
# predpoklad je ze aplikace je ulozena v /srv/ajaxchat
PythonHandler /srv/ajaxchat/poorpublisher.py
PythonPath "['/srv/ajaxchat'] + sys.path"
PythonAutoReload On
<Files ~ "\.(css|js)$">
SetHandler default-handler
</Files>
Soubor .htaccess z aplikace AJAXChat.
Definice obslužných handlerů
Jak sem již napsal výše, API se snaží co nejvíce podobat mod_pythonu, proto obslužný handler dostane v parametru objekt Request. Ten se samozřejmě liší podle toho, zda je aplikace puštěná přes Poor Http, nebo Poor Publisher. Základní práce s objektem a dostupnost metod je ale víceméně shodná. Metoda může končit buď vrácením stavu http.OK či http.DONE, nebo vyvoláním výjimky http.SERVER_RETURN. Obě komponenty odchytí i jiné výjimky a v takovém případě vygenerují chybovou stránku 500, na která podle nastavení ladění bude vygenerován i traceback.
import http
def index(req):
req.content_type = „text/html”
req.sendfile(‚index.html‘)
return http.OK
#enddef
Ukázka metody index.
Homepage, licence, dokumentace
Domovská stránka projektu samotného zatím vlastně pořádně neexistuje, aktuálně je k dispozici jen text na mém blogu. Kód obou komponent je uložen v SVN repositáři na serveru
SourceForge.Net, kde jsou k dispozici i příslušná fóra. Dokumentací je momentálně pouze zdrojový kód a články na mém blogu. Toto plánuji změnit a hodlám vygenerovat jak dokumentaci, tak nějakou srovnávací tabulku v rozdílech při použití PoorHttp a PoorPublisheru (mod_python, resp. Apache). Kód aplikace je samozřejmě otevřený a dále publikovaný pod licencí
BSD, což zaručuje jeho další použití v jakémkoli projektu.
Na závěr zbývá ještě dodat, že obě komponenty sem podrobil zátěžovému testu, a jeho výsledky jsou publikované např.
zde. Na ostrých serverech používám momentálně komponentu PoorPublisher a PoorHttp používám na netbooku pro svojí nenáročnost oproti serveru Apache.
V dalším článku o Pythonu se společně podíváme na backend aplikace AJAXChat, jejíž frontendovou část sem již popsal v
článku ze seriálu o javascriptu.