2012-04-27 4 views
12

La classe HTTPRequest nel framework web tornado * maps GET and POST arguments to lists. Capisco perché - nel caso in cui un dato argomento nome viene utilizzato più volte. Ma per alcuni RequestHandlers, questo è un dolore. Ad esempio, se voglio passare un oggetto json e analizzarlo così com'è sul server.mappe di tornado Argomenti GET e POST per gli elenchi. Come posso disattivare questa "funzione"?

Qual è il modo più semplice per disattivare il comportamento di mappatura su elenco in modo da poter inviare json inalterato a un server tornado/ciclone?

* Ciclone, in realtà, nel caso ci sia una differenza di implementazione qui.

risposta

30

Invece di accedere direttamente self.request.arguments è necessario utilizzare le funzioni di accesso:

self.get_argument("ID", default=None, strip=False) 

Ciò restituisce un singolo elemento.

Se si desidera attivare gli argomenti in un oggetto JSON si può facilmente farlo:

json.dumps({ k: self.get_argument(k) for k in self.request.arguments }) 
+0

Grazie! Cosa succede se voglio solo restituire l'intero set di argomenti come un singolo oggetto json? Potrei ricostruirlo iterando su tutto il dizionario e chiamando get_argument per ogni chiave, ma ciò sembra inefficiente. – Abe

+3

json.dumps ({k: self.get_argument (k) per k in self.request.arguments}) - non è proprio così inefficiente. – koblas

3

Ho intenzione di andare con "sei sfortunato". Potresti riscrivere la classe in questione (sembra che non sarebbe divertente), ma a parte questo non vedo molte opzioni.


Vorrei solo usare una comprensione del ditt.

{k:''.join(v) for k,v in req.arguments.iteritems()} 
+0

Non Disponibile in python 2.x –

+1

@ V3ss0n 'args = { 'foo' :('1' , '2', '3',)}; print {k: ''. Join (v) per k, v in args.iteritems()} 'output' {'foo': '123'} 'utilizzando 2.6+ . – cwallenpoole

+0

@cwallenpoole non è solo in 2.7+? https://docs.python.org/2.7/whatsnew/2.7.html#python-3-1-funzioni – z0r