11.2.3 Interfaccia di alto livello

Nuovo nella versione 2.2.

La precedente sezione spiega come leggere i dati di una form CGI usando la classe FieldStorage. Questa sezione descrive un'interfaccia di più alto livello che è stata aggiunta a questa classe per consentire di operare in un modo più leggibile ed intuitivo. L'interfaccia non fa diventare obsolete le tecniche della sezione precedente -- per esempio, restano comunque utili per elaborare gli upload dei file in modo efficiente.

L'interfaccia consiste di due semplici metodi. Usando i metodi si possono elaborare i dati di una form in un modo generico, senza la necessità di preoccuparsi se uno o più valori sono stati inseriti con lo stesso nome.

Nella precedente sezione, si è appreso come scrivere il seguente codice ogni volta che ci si aspetta che un utente immetta più di un valore con lo stesso nome:

item = form.getvalue("item")
if isinstance(item, list):
    # L'utente sta richiedendo piu` di un elemento.
else:
    # L'utente ha richiesto un solo elemento.

Questa situazione è comune, per esempio, quando una form contiene un gruppo di checkbox multiple con lo stesso nome:

<input type="checkbox" name="item" value="1" />
<input type="checkbox" name="item" value="2" />

In molte situazioni, comunque, c'è un solo campo in una form con un nome particolare e quindi ci si aspetta e si ha necessità di un solo valore associato a questo nome. Così, si scriva uno script contenente per esempio questo codice:

user = form.getvalue("user").upper()

Il problema con il codice è che non ci si deve aspettare che un cliente fornisca un input valido ai propri script. Per esempio, se un utente curioso, aggiunge un altra coppia "user=foo" alla stringa di query, lo script dovrebbe bloccarsi, perché in questa situazione il metodo getvalue("user") restituisce una lista al posto di una stringa. Chiamare il metodo upper() su una lista non viene accettato (dato che le liste non hanno un metodo con questo nome) ed il risultato è un'eccezione AttributeError.

Comunque, il modo appropriato per leggere il valore delle form di dati è usare sempre del codice che controlli che i valori ottenuti siano un valore singolo o una lista di valori. Questo è noioso e rende meno leggibile gli script.

Un approccio più pratico consiste nell'uso dei metodi getfirst() e getlist() forniti da questa interfaccia di più alto livello.

getfirst( name[, default])
Questo metodo restituisce sempre un solo valore associato al nome del campo della form. Il metodo restituisce solo il primo valore nel caso che più valori siano inseriti con il medesimo nome. Notare che l'ordine in cui i valori vengono ricevuti possono variare da browser a browser e non ci si deve fare affidamento.11.1 Se non esiste nessun campo della form o nessun valore, viene restituito il valore specificato attraverso il parametro facoltativo default. Questo parametro default è None se non è specificato.

getlist( name)
Questo metodo restituisce sempre una lista di valori associati al campo della form name. Il metodo restituisce una lista vuota se non esiste nessun valore o nessun campo della form per name. Restituisce una lista consistente in un elemento se esiste solamente un simile valore.

Usando questi metodi si può scrivere del codice compatto.

import cgi
form = cgi.FieldStorage()
user = form.getfirst("user", "").upper()  # Questo metodo è più sicuro.
for item in form.getlist("item"):
    do_something(item)



Footnotes

... affidamento.11.1
Notare che alcune recenti versioni delle specifiche HTML stabiliscono in quale ordine debbano essere valutati i campi, ma è necessario sapere se la richiesta è stata ricevuta da un browser conforme a queste specifiche, o perfino da quale browser è partita, ed è in realtà noioso e porta facilmente a sbagliare.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.