Musím se zmínit o jedné důležité věci - mod_python se příliš nehodí k vlastnímu vývoji. První věcí je načítání modulů (import). Když použijete standardní volání import z Pythonu, musíte po každé změně restartovat Apache, což je nepříjemné. Proto mod_python nabízí vlastí funkci import_module, která časy souborů sleduje a znovu je načítá (pokud máte takto mod_python nastaven - volba PythonAutoReload).
Bohužel to není dokonalé, a i když je automatické načítání souborů zapnuté, ne vždy se po změně některého zdrojového kódu dočkáte načtení. Je to proto, že mod_python sleduje časy souborů stromově - prochází od modulu, ve kterém je metoda zpracovávající požadavek, níže. Jenže když nezměníte modul starající se o zpracování požadavku, tak se ostatní moduly zkrátka znovu nenačtou.
Možných řešení je hned několik, jako nejjednodušší se mi jeví v každé metodě, která má na starost nějaký požadavek, nastavit globální proměnnou __mtime__ na nulu (viz rámeček v minulém čísle). Nebo se doporučuje nastavit MaxRequestsPerChild na 1. Při tomto nastavení bude Apache spouštět při každém požadavku nový proces. Tohle ovšem na produkčních systémech nezapomeňte vypnout, jinak by vám administrátor serveru asi nepoděkoval.
Možná proto existuje mnoho knihoven a aplikačních serverů, které buď vůbec, nebo pro vývoj používají vlastní webový server (napsaný jak jinak než v Pythonu). Jedním z těchto frameworků bych se chtěl ve článku zabývat více, o ostatních se jen zmíním. Nakonec představím aplikační servery pro rozsáhlejší webové systémy a portály.
CherryPy a TurboGears
CherryPy je frameworkem, který nebyl původně určen pro mod_python a na webové servery se nasazuje přes rozhraní WSGI (taková "servlet" specifikace pro Python) nebo pomocí předsazení a modulu mod_redirect. Ovšem pomocí malého mostu mpcp se dá CherryPy provozovat i pomocí mod_pythonu, což je ve většině případech ta nejrychlejší varianta. Takže si CherryPy (čteme [čeri-páj] - třešňový koláč) v krátkosti představíme.
V CherryPy je velký důraz kladen na objektový návrh, autor se zřejmě nechal inspirovat částí ZPublisher z projektu Zope. Jednotlivé adresáře jsou namapovány na objekty, metody nebo dokonce parametry (pomocí metod default - můžete snadno pracovat s adresami, jako je /blog/1980/01/15). Metody objektů zpracovávající požadavky stačí "vystavit" speciálním atributem expose, celý kód je pak velmi intuitivní a nenabourává ostatní business třídy.
Všechno je to obestláno pomocnými třídami, které se starají o sezení, cookies nebo zpracovávání MIME formulářů. Velmi zajímavou vlastností jsou pak filtry, pomocí kterých můžete funkčnost vrstvit (a vytvářet pochopitelně filtry vlastní). Šablonový systém měl projekt CherryPy nejprve vlastní, ale posléze byl odštěpen (nyní jako CherryTemplate) a CherryPy je na šablonách nezávislý. CherryTemplate má jednoduchou HTML-kompatibilní syntaxi (jen pár entit) a je poměrně mocný (rozhodně je na tom lépe než PSP). Také podporuje automatický compiling a cachování, ale měl jsem problémy s Unicode řetězci.
K dispozici je vestavěný webový server určený zejména pro vývoj, ale protože je vícevláknový, dá se nastavit i na produkční režim. Jelikož však umí jen HTTP 1.0, bývá zvykem dát "před něj" Apache, nebo použít WSGI. S mod_pythonem si CherryPy rozumí dobře.
Pokud vás zaujaly knihovny CherryPy a Kid, pak se vám asi bude líbit i Turbogears, kde jsou to hlavní pilíře doplněné o MochiKit (JavaScriptová AJAX-enabled knihovna) a SQLObject (snadné mapování objektů do relačních databází). Turbogears ovšem přichází v pěkném obalu (skvělá webová stránka, dokumentace, instruktážní video) a je blízko vydání verze 1.0. Pokud vám tedy není cizí kombinace CherryPy-Kid (což je podle mě asi nejrozumnější varianta), tak se na TurboGears určitě podívejte a pročtěte si tutoriál na webových stránkách.
Tam se také dozvíte, že TurboGears jsou vlastně jen lepidlem mezi několika knihovnami doplněným o podpůrné nástroje ve stylu Ruby on Rails. Turbogears, podobně jako CherryPy, nemají žádný aplikační server, jsou čistě jen webovým frameworkem.