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.
name[, default]) |
None
se non è specificato.
name) |
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)