ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | OpenSource | PhpNuke | Programming | SysAdm | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
UNO SGUARDO AL PYTHON
Uno sguardo al Python
Primo impatto
Sequenze e dizionari
Controllo di flusso
Windows e Java
Classi e Oggetti
Istanze
Classi
Ereditarietà
Eccezioni
Esempio: Gestione Form
Conclusioni
L'Autore


<<< Esempio: Gestione Form >>>

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

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com