Подтвердить что ты не робот

Tornado request.body

Приложение My Tornado принимает данные POST через HTTP-запрос тела

В моем обработчике я могу получить запрос

def post(self):
    data = self.request.body

Данные, которые я получаю, находятся в строке str (dictionary)

Есть ли способ получить эти данные в виде словаря Python?

Я не хочу использовать eval на стороне сервера, чтобы преобразовать эту строку в словарь Python.

4b9b3361

Ответ 1

В качестве альтернативы Eloim ответ, Tornado предоставляет tornado.escape для "Escaping/unescaping HTML, JSON, URLs и других". Использование его должно дать вам именно то, что вы хотите:

data = tornado.escape.json_decode(self.request.body)

Ответ 2

Вы получаете строку JSON. Расшифруйте его с помощью модуля JSON

import json

def post(self):
    data = json.loads(self.request.body)

За дополнительной информацией: http://docs.python.org/2/library/json.html

Ответ 3

Я думаю, что у меня была аналогичная проблема, когда я разбирал запросы в 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))

Ответ 4

Если вы используете 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)

Ответ 5

как насчет

bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())

Ответ 6

Лучший способ для меня разобрать тело в торнадо встроенный 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`