2013-05-08 2 views
18

My Tornado приложение принимает данные POST через запрос HTTP телаТорнадо request.body

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

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

данные я получаю в от СИЛ (словарь)

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

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

+0

Это, вероятно, строка JSON. – Blender

+0

Есть ли способ конвертировать эту строку json в словарь python без использования eval. –

+0

Эта строка json включает в себя пробелы, в которых нет других библиотек json, чтобы передать их в python dictionar. –

ответ

16

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

import json 

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

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

+12

в Python3 вам необходимо декодировать исходную байтовую строку, например. 'json.loads (self.request.body.decode ('utf-8'))' –

+1

Теперь вы можете использовать 'tornado.escape.json_decode (self.request.body)', который будет обрабатывать все декодирование для вас. –

+0

Обратите внимание, что использование 'tornado.escape' wrappers для' json.loads' означает, что вы не сможете настроить/переопределить 'JSONDecoder' с' cls' или 'parse _...' kwargs. (Это больше проблема с использованием дополнительного 'tornado.escape.json.encode', который обертывает' json.dumps', но все равно стоит упомянуть здесь.) – cowbert

1

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

Мне любопытно, что ответ был, так что сообщите мне, помогло ли это (или вы выяснили это в чате). Я почти уверен, что это потому, что он был закодирован в url. – Mitch

+0

Экипаж помог мне здесь. – RandomInsano

+0

Для python3 это 'urllib.parse.unquote_plus()' – NuclearPeon

25

В качестве альтернативы ответа Eloim, в Торнадо обеспечивает tornado.escape для «Escaping/unescaping HTML, JSON, URL-адреса и другие». С его помощью должно дать вам то, что вы хотите:

data = tornado.escape.json_decode(self.request.body) 
-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` 
0

Если вы используете webapp2, он использует свои собственные JSon статистов. (Decode) 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) 
0

как о

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

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему оно решает проблему, улучшит долгосрочную ценность ответа. –

Смежные вопросы