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.
