Písanie webových stránok v pythone dnes nieje žiadna novinka. Na písanie takýchto webov sa dajú použiť rôzne frameworky (Zope, Django) a sú síce veľmi efektívne a weby sa v nich píšu naozaj ľahko stále im chýba podpora a rozbehnutie takéhoto frameworku bude najskôr mozné tak na vlastnom servery. mod_python už integrujú rozne webhostingové spoločnosti a aj keď je podpora stále ešte malá dajú sa nájsť spoločnosti ktoré túto službu ponúkajú.
Nebudem sa venovať inštalácii a konfigurácii mod_pythonu do apache, budem predpokladať, že mod_python máte nainštalovaný a apache správne nakonfigurovaný. Budem sa venovať hlavne handlerom v ktorých je celá krása programovania s týmto modulom pre apache. O čo teda ide?
Ak sa snažíme načítať script ktorý sme napísali v pythone mod_python spravý nasledovnú vec. Pozrie ci sme zadali do apache konfigurácie defaultný handler pre python scripty a ak nie, tak predpokladá, že náš script je takýto handler. Handler je obyčajný script ktorý obsahuje funkciu nazvanú handler a preberá ako argument request object. Takže aj tento script je python handler:
from mod_python import apache def handler(req): return apache.OK
Tento však nerobí vôbec nič. Ak si nechceme programovať vlastný handler môžeme použiť už existujúci. So základnou inštaláciou sa dodáva Publisher a PSP.
Publisher
Publisher robí to, že zistí či je zadaný názov funkcie v adrese uri a ak nieje zavolá defaultne funkciu index, ak je zadaný názov zavolá funkciu podľa názvu. Prvý argument tejto funkcie je request object a ostatné argumenty sú argumenty predané v uri. ako to teda vyzerá?
Ak máme uri
/index.py/uvod?arg1=val1&arg2=val2
Publisher takto zavolá funkciu uvod v subore index.py
uvod(req, arg1 = val1, arg2 = val2)
preto script môže vyzerať takto:
def uvod(req, arg1, arg2): req.write("prvy argument " + arg1 + " a druhy " + arg2)
PSP
PSP sa podobá php vkládaním python kódu priamo do html. Začiatok python kódu sa potom označuje <% a koniec %> takže to vyzerá asi takto:
<html>
<%
import time
%>
Hello world, the time is: <%=time.strftime("%Y-%m-%d, %H:%M:%S")%>
</html>Pre dôkladnejší opis si treba prečítať manuál.
Aby sme teda povedali apachu ktorý handler chceme používať musíme pridať nastavenie do .htaccess alebo priamo do konfigurácie apache. Je to konkrétne voľba PythonHandler čize napríklad:
AddHandler mod_python .py
PythonHandler mod_python.publisher # (mod_python.psp) podla vyberu
Vlastný handler
Teraz vám ukážem ako napísať jednoduchý handler. Určíme si najskor co by mal zvládať. Takže povedzme ze čo zadáme za názov súboru bude meno triedy ktorú chceme zavolať. A defaultne sa bude volať metóda triedy nazvaná index. Ak nebude zadaný názov triedy zavolá sa trieda index. Ak bude zadaný názov triedy aj názov metódy zavoláme triedu aj požadovanú metódu.
Čiže uri
/index.py/trieda
zavolá triedu nazvanú “trieda” uloženú v súbore index.php. Ale ak bude
/index.py/trieda/metoda
zavolá triedu nazvanú “trieda” a jej metódu nazvanú “metoda”.
Kod bude teda vyzerať prekvapivo jednoducho:
#!/usr/bin/python from mod_python import apache import os def handler(req): req.content_type = "text/html" if not os.path.isfile(req.filename): # ak zadany subor neexistuje return apache.HTTP_NOT_FOUND # hodi 404-ku path = req.path_info # req.path_info je cast medzi # filename a args if type(path) != str: # ak type path nieje string tak path = '' # je None a spravime z neho string if path != '': path = path[1:] # odstranime zaciatocne lomitko path = path.split("/") # rozdelime path if len(path) > 1: # je zadane aj meno triedy aj meno obj = path[0] # metody met = path[1] elif len(path) == 1: # je zadane len meno triedy obj = path[0] # metoda je index met = "index" else: obj = "Index" # neni zadane ani meno triedy ani meno metody met = "index" # metoda aj trieda je index mod = apache.import_module(req.filename) # importuj zadany subor exec "obj = mod." + obj + "()" # vytvor objekt zadanej triedy exec "obj." + met + "(req)" # zavolaj zadanu metodu return apache.OK # vsetko prebehlo v poriadku
Ako vidíte nič zložité. Má to samozrejme len základnú funkcionalitu ale ako príklad poslúži.
Uložíme teda tento script do súboru handler.py a do .htaccess napíšeme
PythonHandler handler.pyTeraz už používame vlastný handler. Vyskúšame skúšobný script aby sme zistili či funguje:
class Index: def index(self, req): req.write("Index.index") def other(self, req): req.write("Index.other") class Other: def index(self, req): req.write("Other.index") def other(self, req): req.write("Other.other")
Zadáme do prehliadača url:
http://localhost/index.py/Index/other
a zobrazí sa
Index.other
čo znamená, že všetko funguje tak ako má.
Osobne považujem tieto handlery za veľké plus lebo nieje zadaná iba jedna cesta ktorou sa dá uberať ako je tomu napríklad u php. Takže keď vám niečo nieje jasné alebo sa vám niečo na článku nepáčilo napíšte komentar.






Ďalšie články, ktoré by ťa mohli zaujať
Žiadne odpovede v “Písanie vlastných handlerov pre mod_python”