2013-05-08 146 views
18

我的龙卷风应用程序通过HTTP请求的身体接受POST数据龙卷风request.body

在我的处理程序我能够获得请求

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

我得到的数据是在从STR的(字典)

有没有办法以Python字典的形式接收这些数据?

我不想在服务器端使用eval将此字符串转换为Python字典。

+0

这可能是一个JSON字符串。 – Blender 2013-05-08 23:04:44

+0

有没有办法将这个json字符串转换成python字典而不使用eval。 – 2013-05-08 23:07:22

+0

这个json字符串涉及的空格不包含其他json库将其转换为python字典 – 2013-05-08 23:08:24

回答

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'))' – 2014-04-17 11:35:38

+1

您现在可以使用'tornado.escape.json_decode(self.request.body)'来处理所有的解码。 – 2016-11-21 11:55:43

+0

请注意,使用'tornado.escape'包装器到'json.loads'意味着你将无法使用'cls'或'parse _...'kwargs自定义/重写'JSONDecoder'。 (这是使用互补的'tornado.escape.json.encode'来封装'json.dumps'的更多问题,但在这里仍然值得一提。) – cowbert 2018-01-16 00:14:52

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

我很好奇答案是什么,所以让我知道这是否有帮助(或者你是否在聊天中发现它)。我几乎肯定这是因为它是由网址编码的。 – Mitch 2013-06-24 18:35:13

+0

逃离帮助我在这里。 – RandomInsano 2014-08-15 20:55:11

+0

对于python3,它是'urllib.parse.unquote_plus()' – NuclearPeon 2015-05-13 01:47:22

25

作为替代Eloim的回答,龙卷风提供“逃离/消除HTML,JSON,URL和其他”的tornado.escape。使用它应该给你你想要什么:

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

怎么样

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

虽然这段代码可能回答这个问题,但提供关于如何和/或为何解决问题的附加上下文会提高答案的长期价值。 – 2017-05-27 11:01:26