|
Concludiamo l'articolo con un esempio un po' più
dettagliato e significativo: un piccolo programma che può
essere usato per i vostri script Web di gestione form. Tengo a
precisare che l'esempio qui pubblicato è stato scritto
utilizzando Windows 98 con Personal Web Server. L'unico
accorgimento per utilizzarlo in questo ambiente è quello di
aggiungere al registro la key
"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap\.py"
con valore di tipo stringa "C:\Python\Python.exe %s", e di
porre i vostri script in una directory web-shared con il permesso
execute attivato. Lo script comunque ha girato senza problemi
sotto Linux. In questo caso è stato usato il meccanismo del
bang-path, ovvero inserire come prima riga del codice il
riferimento all'interprete dello script con il prefisso #! Una
schermata dello script è visibile in Figura 1, mentre lo
script stesso è nel Listato 2.
#!/usr/bin/python
# Parameters
REREFER="http://192.168.1.4/python/form.py"
# imports
import cgi
import string
# Print the Form
def print_form(err, nome, cognome, email):
print """
<head><title>Modulo Richiesta di Informazioni</title></head>
<body>
<h1>Modulo Richiesta Informazioni</h1>
Si prega di specificare i suoi dati.<br>
Verrą rincontattato al pił presto.<hr>
"""
if err:
print "<h2><b>Errore nel modulo:</b> <tt>"+err+"</tt></h2>"
# output form with current fields
print """
<form action='%s'>
<table>
<tr><td>Nome:
<td><input type="text" name="nome" size="20" value="%s"><br>
<tr><td>Cognome:
<td><input type="text" name="cognome" size="20" value="%s"><br>
<tr><td>Email:<br>
<td><input type="text" name="email" size="20" value="%s"><br>
<tr><td colspan=2 align=center><input type="submit" name="invia" value="INVIA">
</table>
</form>
""" % (REREFER, nome, cognome, email)
def form_check(form):
err = ""
nome = ""
cognome = ""
email = ""
if not form.has_key("nome"):
err = err + "<br>Specificare il nome"
else:
nome = form["nome"].value
if not form.has_key("cognome"):
err = err + "<br>Specificare il cognome"
else:
cognome = form["cognome"].value
if not form.has_key("email"):
err = err + "<br>Specificare l'email"
else:
email = form["email"].value
if string.find(email, "@") == -1:
err = err + "<br>Il formato della email non e' corretto"
return (err, nome, cognome, email)
def send_mail(form):
email = """
Nome.....: %s
Cognome..: %s
Email....: %s
""" % (form['nome'].value, form['cognome'].value, form['email'].value)
print """
<head><title>Modulo Richiesta di Informazioni</title></head>
<body>
<h1>Conferma Richiesta</h1>
E' stata inviata la seguente richiesta di informazioni:<hr>
<pre>%s</pre>
""" % (email)
# send mail here...
# Always
print "Content-type: text/html\n\n<html>"
form = cgi.FieldStorage()
(err, nome,cognome,email) = form_check(form)
if form.has_key("invia"):
if err:
print_form(err, nome, cognome, email)
else:
send_mail(form)
else:
# first run
print_form("",nome, cognome, email)
print "<hr>La ringraziamo per la preferenza accordataci.<br>Cordiali Saluti.</html>"
Listato 2
Spendiamo due parole sul funzionamento dello script
anche perché il Python è posizionabile come una
alternativa al Perl, e gli script CGI sono probabilmente il campo
di applicazione più immediato del Python. Nel nostro
script abbiamo utilizzato il modulo standard cgi per
decifrare i parametri dello script. Come è noto il protocollo
CGI invia i dati in un formato encrittato non particolarmente
user-friendly. Chiamando form = cgi.FieldStorage viene
costruito un oggetto contente i parametri passati allo script
decifrati. A questo oggetto è possibile accedere come array
associativo, estraendo i campi della form: form["nome"],
eccetera. Attenzione che se si accede ad un campo non definito si
ottiene una eccezione, per cui occorre verificare l'esistenza di
una chiave usando form.has_key("nome"). Nello script abbiamo
anche usato altre due feature del Python adatte alla generazione di
pagine Web: il triple quote """ e l'operatore di I/O
%. Per inserire in uno script Python stringhe di testo
contenenti newline si deve usare come delimitatore tre virgolette.
Un altro aspetto importante è che la print stampa una stringa,
e le stringhe sono in Python immutabili. Per cui, anche se
è possibile, fare "taglia e cuci" con le stringhe per comporre
la pagina di output, è abbastanza inefficiente e scomodo. Per
ovviare, esiste un meccanismo di output analogo alla printf
del C, che illustriamo con un esempio:
>>> x = 1
>>> y = 'hello'
>>> z
La stringa che segue il print contiene delle
specifiche di formato, composte dal % seguito da un carattere: d
indica i numeri decimali, s le stringhe e c i caratteri. Le
specifiche di formato vengono sostituite dai parametri che seguono
l'operatore % dopo la stringa. Nell'esempio vediamo come il %d
venga sostituito dal valore decimale di x, il %s dalla stringa y
mentre il %c genera il carattere il cui codice ascii è
contenuto nella variabile z (il codice ascii di '@' è appunto
64).
|