Domanda

BaseHTTPHandler dal BaseHTTPServer modulo non sembra fornire alcun modo conveniente per accedere a http parametri della richiesta.Qual è il modo migliore per analizzare il OTTENERE parametri di strada, e i parametri POST dal corpo della richiesta?

Proprio ora, sto usando questo per OTTENERE:

def do_GET(self):
    parsed_path = urlparse.urlparse(self.path)
    try:
        params = dict([p.split('=') for p in parsed_path[4].split('&')])
    except:
        params = {}

Questo funziona per la maggior parte dei casi, ma vorrei qualcosa di più robusto che gestisce le codifiche e di casi come parametri vuoti correttamente.Idealmente, vorrei qualcosa di piccolo e autonomo, piuttosto che framework per il web.

È stato utile?

Soluzione

Si potrebbe provare il Werkzeug moduli, la base biblioteca Werkzeug non è troppo grande e, se necessario, si può semplicemente estrarre questo pezzo di codice e il gioco è fatto.

Il metodo restituisce un url_decode MultiDict e ha il supporto di codifica:)

A differenza del metodo di urlparse.parse_qs la versione Werkzeug si prende cura di:

  • encoding
  • più valori
  • ordinamento

Se non avete bisogno di queste opzioni (o, nel caso di codifica, utilizzare Python 3) che si sentono liberi di utilizzare le soluzioni integrate.

Altri suggerimenti

Si consiglia di utilizzare urllib.parse :

>>> from urllib.parse import urlparse, parse_qs
>>> url = 'http://example.com/?foo=bar&one=1'
>>> parse_qs(urlparse(url).query)
{'foo': ['bar'], 'one': ['1']}

Python 2 , il modulo è denominato urlparse.parse_qs urlparse invece di url.parse.

Una migliore soluzione ad una vecchia questione:

def do_POST(self):
    length = int(self.headers.getheader('content-length'))
    field_data = self.rfile.read(length)
    fields = urlparse.parse_qs(field_data)

Questo tirerà dati POST urlencoded dal contenuto del documento e analizzare un dict con una corretta urldecoding

Avete indagato utilizzando librerie come CherryPy ? Essi forniscono un percorso molto più veloce da gestire queste cose che BaseHTTPServer.

HTTP di base parametri di richiesta supporto CGI modulo.Il meccanismo raccomandato per gestire i dati del modulo è l' cgi.FieldStorage classe.

Per ottenere dati inviati tramite form, è meglio usare il FieldStorage classe.Le altre classi definite in questo modulo sono fornite per lo più per motivi di compatibilità.Istanziare una sola volta, senza argomenti.Questa legge il contenuto del modulo da standard input o per l'ambiente (a seconda del valore di alcune variabili d'ambiente impostate secondo la CGI standard).Quanto può consumare standard input, dovrebbe essere istanziata una sola volta.

Il FieldStorage l'istanza può essere indicizzato come un dizionario Python.Esso consente di appartenenza test con l'operatore in, e supporta anche il dizionario standard metodo keys() e il built-in funzione len().Campi del modulo contenente le stringhe vuote vengono ignorate e non appaiono nel dizionario;per mantenere tali valori, fornire un vero valore per l'invio facoltativo keep_blank_values parola chiave parametri durante la creazione del FieldStorage esempio.

Per esempio, il codice riportato di seguito (il che presuppone che l'intestazione Content-Type e riga vuota sono già stati stampati) controlla che i campi nome e indirizzo sono entrambi impostati su una stringa non vuota:

form = cgi.FieldStorage()
if "name" not in form or "addr" not in form:
    print "<H1>Error</H1>"
    print "Please fill in the name and addr fields."
    return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
#...further form processing here...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top