06.02.2008 Python na webu 2.díl (zpracování formulářových dat)

Další díl seriálu bych chtěl věnovat formulářovým datům. Pro tuto práci se dá použít několik různých způsobů. Já se budu detailně zabývat pouze jedním a to je použitím třídy FieldStorage.

Uvedu hned několik příkladů, jak zjistit základní informace. Můžete si sami vyzkoušet odesláním jednoduchého formuláře, který je uveden níže a pouze stačí měnit GET a POST.

# GET and POST priklady
from mod_python import apache

def handler(req):

    req.content_type='text/html'

    if req.uri == "/":
        return showForm(req)
    #endif

    # zpracuje se GET
    if req.method == 'GET':
        data = req.args

        req.write("Metoda: %s<br>" % req.method)
        req.write("Data: %s" % data)

    # zpracuje se POST
    elif req.method == 'POST':

        req.write("Metoda: %s<br>" % req.method)
        req.write("Data: %s" %
                  req.read(int(req.headers_in["content-length"])))

    # zpracuje se jina metoda napr: HEAD
    else:
        req.write("Jina metoda: %s<br>" % req.method)
    #endif

    return apache.OK
#enddef

def showForm(req):
    req.write('<form method="POST" action="/show">')
    req.write('<input type="text" name="a" value="1" />')
    req.write('<input type="text" name="b" value="2" />')
    req.write('<input type="submit" value="Odeslat" />')
    req.write('</form>')
    return apache.OK
#enddef

Myslím že tohle pro základní pochopení stačí. Jak se získanými informacemi naložíte je na Vás. Určitě uznáte, že psát si vlastní parser by stálo nějaké úsilí. Pokud se budete chtít dozvědět více, doporučuji nahlédnout do souboru /usr/lib/python2.4/site-packages/mod_python/util.py, kde se celý proces parsování nachází a přesně tomuto souboru se budu věnovat více, protože se v něm nachází třída, která se jmenuje FieldStorage.

. Její použití je velice jednoduché. Skript upravíme takto:
from mod_python import apache
from mod_python import util

def handler(req):

    req.content_type='text/html'

    if req.uri == "/":
        return showForm(req)
    #endif

    fs = util.FieldStorage(req, keep_blank_values = 1)

    req.write("Zparsovana data<br>")
    for item in fs.list:
        req.write("Jmeno: %s, hodnota: %s<br>" % (item.name, item.value))
    #endfor

    return apache.OK
#enddef

def showForm(req):
    req.write('<form method="POST" action="/show">')
    req.write('<input type="text" name="a" value="1" />')
    req.write('<input type="text" name="b" value="2" />')
    req.write('<input type="submit" value="Odeslat" />')
    req.write('</form>')
    return apache.OK
#enddef

A máme naparsováno, co dál ? Data jsou přístupná jako list objektů typu Field. Proto, aby se s daty dobře pracovalo, má objekt několik důležitých metod. Celý popis třídy je zde. V tuto chvíli jako zaklad stačí tři nejdůležitější: get, getfirst a getlist. A zase malý příklad:

from mod_python import apache
from mod_python import util

def handler(req):

    req.content_type='text/html'

    if req.uri == "/":
        return showForm(req)
    #endif

    fs = util.FieldStorage(req, keep_blank_values = 1)

    a      = fs.get('a', -1)
    aList  = fs.getlist('a', -1)
    bList  = fs.getlist('b')
    bFirst = fs.getfirst('b', -1)

    req.write("a: %s<br>" % a)
    req.write("aList: %s<br>" % aList)
    req.write("bList: %s<br>" % bList)
    req.write("bFirst: %s<br>" % bFirst)

    return apache.OK
#enddef

def showForm(req):
    req.write('<form method="POST" action="/show">')
    req.write('<input type="text" name="a" value="1" />')
    req.write('<input type="text" name="b" value="2" />')
    req.write('<input type="text" name="b" value="3" />')
    req.write('<input type="submit" value="Odeslat" />')
    req.write('</form>')
    return apache.OK
#enddef

No a nakonec jsem připravil ještě jeden příklad, ve kterém je třída FieldStorage obalená tak, aby se s ní pracovalo ještě lépe.

Použití je jednoduché

from mod_python      import apache
from myfieldstorage  import MyFieldStorage

def handler(req):

    req.content_type='text/html'

    if req.uri == "/":
        return showForm(req)
    #endif

    form = MyFieldStorage(req)

    aInt     = form.get('a', int, None)
    aStr     = form.get('a', str, None)
    bListStr = form.getlist('b', str)
    bListInt = form.getlist('b', int)

    req.write("a jako int: %s<br>" % aInt)
    req.write("a jako string: %s<br>" % aStr)
    req.write("b jako list stringu: %s<br>" % bListStr)
    req.write("b jako list intu: %s<br>" % bListInt)

    return apache.OK
#enddef

def showForm(req):
    req.write('<form method="POST" action="/show">')
    req.write('<input type="text" name="a" value="1" />')
    req.write('<input type="text" name="b" value="2" />')
    req.write('<input type="text" name="b" value="3" />')
    req.write('<input type="submit" value="Odeslat" />')
    req.write('</form>')
    return apache.OK
#enddef

Vypadá to docela jednoduše a i takto jednoduše se to používá. Jako úplný základ zpracování vstupu by to mohlo stačit. Všechny příklady si můžete vyzkoušet tak, že kód vložíte do souboru s názvem index.py a použijete konfiguraci z prvního dílu seriálu. Pro poslední příklad si musíte stáhnout navíc tento wrapper, který uložíte do stejného adresáře. ve kterém je index.py.

V některém z dalších dílů by se chtěl věnovat ještě přirozenějšímu a efektivnějšímu zpracování formou bindování hodnot přímo do předaného objektu, což bude určitě zajímavější. Ale to je prozatím vše, příště bych se chtěl věnovat elegantnějšímu zpracování výstupu do html použitím šablonovacího systému Teng.

Komentáře (0)

© 2008. Weblog nejen o práci. www.Karotka.cz. Rss    Google Pagerank - www.karotka.czGoogle Pagerank S-Rank - www.karotka.czS-Rank