twitter facebook

Písanie vlastných handlerov pre mod_python

PythonPí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) &gt; 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.py

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




Žiadne odpovede v “Písanie vlastných handlerov pre mod_python”

Článok “Písanie vlastných handlerov pre mod_python” zatiaľ ešte nikto nekomentoval. Buď prvý, kto vyjadri svoj názor.
 
 
 

* Email nebude nikde uverejnený.


Pravidlá: Tie su jednoduché, vyhni sa invektívam a spamovaniu, a môžeš si byť istý, že tvoj komentár tu zostane. Tu si tykáme.

Môžeš použiť tieto tagy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">


Komentáre

Mark Zuckerberg chce spoplatniť Facebook

schusterr - 31.07.2010 04:17
ten Mark Zuckerberger je miliardar , ten uz moc lowe k zivotu nepotrebuje :)

Ako na zvonenie pre iPhone?

ByteLeak - 16.07.2010 10:39
Jednoducho si najdes priecinok zo zvoneniami (pravy klik na ten upraveny song, a Show in windows Explorer) ...

Ako na zvonenie pre iPhone?

andrea - 16.07.2010 08:16
nie som velmi technicky typ teda, ale zda sa mi to celkom logicke :) ale tak ci tak som natrafila na ...

Mark Zuckerberg chce spoplatniť Facebook

Baribylina - 04.07.2010 11:41
Či už je to pravda alebo nie..existuje mnoho podobných(i lepších)blogov, na ktore sa da bez problemov ...

Ako na zvonenie pre iPhone?

Lukáš - 11.06.2010 14:49
bohužial nemam tam takú možnosť create AAC version..
ByteLeak.com
Hore
36 queries in 0.561 seconds.