mac - tornado python git
Solicitud de tornado. (6)
Mi aplicación Tornado acepta datos POST a través de la solicitud del cuerpo http
En mi manejador puedo obtener la solicitud
def post(self):
data = self.request.body
Los datos que estoy obteniendo están en el formato de (diccionario)
¿Hay alguna forma de recibir estos datos en forma de un diccionario de Python?
No quiero usar eval
en el lado del servidor para convertir esta cadena a un diccionario de Python.
Como una alternativa a la respuesta de Eloim, Tornado proporciona tornado.escape para "Escape / inescaping HTML, JSON, URLs y otros". Usarlo debería darte exactamente lo que quieres:
data = tornado.escape.json_decode(self.request.body)
Creo que tuve un problema similar cuando estaba analizando solicitudes en Tornado. Intente usar el módulo urllib.unquote_plus:
import urllib
try:
import simplejson as json
except ImportError:
import json
data = json.loads(urllib.unquote_plus(self.request.body))
Mi código tenía que estar preparado para los dos formatos diferentes de solicitud, así que hice algo como:
try:
json.loads(self.request.body)
except:
json.loads(urllib.unquote_plus(self.request.body))
Estás recibiendo una cadena JSON. Descifra con el módulo JSON.
import json
def post(self):
data = json.loads(self.request.body)
Para más información: http://docs.python.org/2/library/json.html
La mejor manera de analizar el cuerpo en tornado incorporado httputil
Buen trabajo con entrada múltiple (como casilla de verificación, tablas, etc.). Si los elementos de envío tienen el mismo nombre en el diccionario, devuelve la lista de valores.
Muestra de trabajo
import tornado.httputil
def post(self):
file_dic = {}
arg_dic = {}
tornado.httputil.parse_body_arguments(''application/x-www-form-urlencoded'', self.request.body, arg_dic, file_dic)
print(arg_dic, file_dic) # or other code`
Si está utilizando WebApp2, utiliza sus propios extras json. (Decodificar) http://webapp2.readthedocs.io/en/latest/_modules/webapp2_extras/json.html
data = json.decode(self.request.body)
v = data.get(key)
self.response.write(v)
Por ejemplo, mi clave de entrada es ''postvalor''
data = json.decode(self.request.body)
v = data.get(''postvalue'')
self.response.write(v)
qué tal si
bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())