Tornado request.body

20

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

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

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

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

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

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

    
задан Joel James 09.05.2013 в 01:03
источник
  • Это, вероятно, строка JSON. –  Blender 09.05.2013 в 01:04
  • Есть ли способ конвертировать эту строку json в словарь python без использования eval. –  Joel James 09.05.2013 в 01:07
  • Эта строка json включает пробелы, в которых нет других библиотек json, чтобы перевести их в python dictionar –  Joel James 09.05.2013 в 01:08
  • Можете ли вы опубликовать образец? –  Blender 09.05.2013 в 01:08
  • {\ n \ "_ id \": \ "cd4cca2_9vg5jywwqxgmxfr \", \ n \ "time \": '2012-01-01', \ n \ "opening_type \": \ "Recall \", \ n }» –  Joel James 09.05.2013 в 01:17
Показать остальные комментарии

6 ответов

26

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

data = tornado.escape.json_decode(self.request.body)
    
ответ дан Farray 25.01.2015 в 21:13
источник
17

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

import json

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

Для получения дополнительной информации: Ссылка

    
ответ дан Eloims 10.05.2013 в 11:02
источник
  • в Python3 вам необходимо декодировать исходную байтовую строку, например. json.loads (self.request.body.decode ( 'UTF-8')) –  3k- 17.04.2014 в 13:35
  • Теперь вы можете использовать tornado.escape.json_decode (self.request.body), который будет обрабатывать все декодирование для вас. –  Will S 21.11.2016 в 12:55
  • Обратите внимание, что использование обложек tornado.escape для json.loads означает, что вы не сможете настроить / переопределить JSONDecoder с помощью cls или parse _... kwargs. (Это больше проблема с использованием дополнительного tornado.escape.json.encode, который обертывает json.dumps, но все равно стоит упомянуть здесь.) –  cowbert 16.01.2018 в 01:14
1

Я думаю, что у меня была аналогичная проблема, когда я разбирал запросы в 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))
    
ответ дан Mitch 24.06.2013 в 20:31
источник
  • Мне любопытно, что ответ был, так что дайте мне знать, помогло ли это (или вы выяснили это в чате). Я почти уверен, что это потому, что он был закодирован в url. –  Mitch 24.06.2013 в 20:35
  • Побег помог мне здесь. –  RandomInsano 15.08.2014 в 22:55
  • Для python3 это urllib.parse.unquote_plus () –  NuclearPeon 13.05.2015 в 03:47
0

Если вы используете WebApp2, он использует свои собственные json-приложения. (Декодирование) Ссылка

    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)
    
ответ дан ADL 31.03.2017 в 05:01
источник
0

как насчет

bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())
    
ответ дан suger 27.05.2017 в 10:40
источник
  • Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему оно решает проблему, улучшит долгосрочную ценность ответа. –  Donald Duck 27.05.2017 в 13:01
-1

Лучший способ для меня разобрать тело в торнадо встроенный 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'
    
ответ дан Max Marchuk 26.02.2017 в 23:48
источник