2013-05-08 223 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