11.2.9 Il debugging sugli script CGI

Prima di tutto, verificare triviali errori di installazione; leggere attentamente la sezione precedente sull'installazione degli script CGI può far risparmiare molto tempo. Se ci si meraviglia del modo in cui si è capita la corretta procedura di installazione, si provi a installare una copia di questo modulo (cgi.py) come script CGI. Quando richiamato come script, il file mostra il suo ambiente ed il contenuto della form in formato HTML. Gli si diano i giusti diritti, etc, e gli si invii una richiesta. Se è installato nella directory standard cgi-bin, è possibile inviargli una richiesta inserendo una URL nel browser come se fosse una form.

http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home

Se questo restituisce un errore di tipo 404, il server non trova lo script, forse va installato in una directory differente. Se restituisce un altro errore, c'e' un problema di installazione e lo si deve correggere prima di tentare qualsiasi altra cosa. Se si riceve un elenco piacevolmente formattato dell'ambiente ed il contenuto della form (in questo esempio, il campo dovrebbe essere mostrato come ``addr'' con valore ``At Home'' e ``name'' con valore ``Joe Blow''), lo script cgi.py è stato installato correttamente. Se si segue la stessa procedura per il proprio script, si è in grado di farne il debug.

Il prossimo passo potrebbe essere la chiamata dal proprio script della funzione test() del modulo cgi: sostituire il codice principale con la singola definizione:

cgi.test()

Questo dovrebbe produrre lo stesso risultato come quando si è installato il file cgi.py da solo.

Quando uno script Python generico solleva una eccezione non gestita (per diverse ragioni: un errore in un nome modulo, un file che non può essere aperto, etc.), l'interprete Python stampa una traceback elegante ed esce. Mentre l'interprete Python fa la stessa cosa quando lo script CGI solleva una eccezione, più facilmente una traceback finirà in uno dei file di log del server HTTP, oppure verrà abbandonato.

Fortunatamente, dopo aver lavorato intorno allo script per eseguire del codice, si può facilmente inviare una traceback al browser web usando il modulo cgitb. Se non si è già fatto, si aggiunga semplicemente questa riga

import cgitb; cgitb.enable()

all'inizio del proprio script. Quindi si tenti nuovamente l'esecuzione; quando insorge un problema, si dovrebbe vedere un rapporto dettagliato che facilmente renderà visibile la causa del crash.

Se si sospetta che ci potrebbe essere un problema nell'importazione del modulo cgitb, si può utilizzare un metodo più robusto (che usa solo moduli built-in):

import sys
sys.stderr = sys.stdout
print "Content-Type: text/plain"
print
..il proprio codice da qui...

Questo permette all'interprete Python di stampare la traceback. Il tipo di contenuto del risultato viene impostato a testo puro, che disabilita l'elaborazione di HTML. Se lo script funziona, l'HTML verrà mostrato dal client. Se viene sollevata un'eccezione, meglio se dopo che le prime due righe vengono stampate, verrà mostrata una traceback. Siccome non c'è interpretazione HTML in corso, la traceback sarà leggibile.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.