Ответ 1
В качестве альтернативы Eloim ответ, Tornado предоставляет tornado.escape для "Escaping/unescaping HTML, JSON, URLs и других". Использование его должно дать вам именно то, что вы хотите:
data = tornado.escape.json_decode(self.request.body)
Приложение My Tornado принимает данные POST через HTTP-запрос тела
В моем обработчике я могу получить запрос
def post(self):
data = self.request.body
Данные, которые я получаю, находятся в строке str (dictionary)
Есть ли способ получить эти данные в виде словаря Python?
Я не хочу использовать eval
на стороне сервера, чтобы преобразовать эту строку в словарь Python.
В качестве альтернативы Eloim ответ, Tornado предоставляет tornado.escape для "Escaping/unescaping HTML, JSON, URLs и других". Использование его должно дать вам именно то, что вы хотите:
data = tornado.escape.json_decode(self.request.body)
Вы получаете строку JSON. Расшифруйте его с помощью модуля JSON
import json
def post(self):
data = json.loads(self.request.body)
За дополнительной информацией: http://docs.python.org/2/library/json.html
Я думаю, что у меня была аналогичная проблема, когда я разбирал запросы в Tornado. Попробуйте использовать модуль urllib.unquote_plus:
import urllib
try:
import simplejson as json
except ImportError:
import json
data = json.loads(urllib.unquote_plus(self.request.body))
Мой код должен был быть подготовлен для обоих разных форматов запроса, поэтому я сделал что-то вроде:
try:
json.loads(self.request.body)
except:
json.loads(urllib.unquote_plus(self.request.body))
Если вы используете WebApp2, он использует свои собственные json-приложения. (Декодирование) 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)
Например, мой почтовый ключ - это "postvalue"
data = json.decode(self.request.body)
v = data.get('postvalue')
self.response.write(v)
как насчет
bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())
Лучший способ для меня разобрать тело в торнадо встроенный httputil
Хорошая работа с несколькими входами (например, флажок, таблицы и т.д.).
Если элементы отправки имеют одинаковое имя в словаре, возвращающем список значений.
Рабочий пример:
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`