2012-04-27 10 views
12

La clase HTTPRequest en el marco web tornado * útil maps GET and POST arguments to lists. Entiendo por qué, en caso de que se use un nombre de argumento dado varias veces. Pero para algunos RequestHandlers, esto es un dolor. Por ejemplo, si quiero pasar un objeto json y analizarlo tal como está en el servidor.tornado maps GET y POST argumentos a las listas. ¿Cómo puedo desactivar esta "característica"?

¿Cuál es la forma más directa de desactivar el comportamiento del mapa a la lista para que pueda enviar json inalterado a un servidor tornado/ciclón?

* Cyclone, en realidad, en caso de que haya una diferencia de implementación aquí.

Respuesta

30

En lugar de acceder directamente self.request.arguments debe utilizar las funciones de acceso:

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

Esto devuelve un solo elemento.

Si desea activar los argumentos en un objeto JSON que puede hacer con bastante facilidad por lo que:

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

¡Gracias! ¿Qué sucede si solo quiero devolver todo el conjunto de argumentos como un solo objeto json? Podría reconstruirlo iterando sobre todo el diccionario y llamando a get_argument para cada clave, pero parece ineficaz. – Abe

+3

json.dumps ({k: self.get_argument (k) para k en self.request.arguments}) - en realidad no es tan ineficiente. – koblas

3

Voy a decir "no tienes suerte". Podrías volver a escribir la clase en cuestión (parece que eso no sería divertido), pero aparte de eso, no veo muchas opciones.


Yo solo usaría una comprensión dict.

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

No disponible en Python 2.x –

+1

@ V3ss0n 'args = { 'foo' :('1' , '2', '3',)}; print {k: ''. Join (v) para k, v en args.iteritems()} 'outputs' {'foo': '123'} 'usando 2.6+ . – cwallenpoole

+0

@cwallenpoole no es solo en 2.7+? https://docs.python.org/2.7/whatsnew/2.7.html#python-3-1-features – z0r