我的 Tornado 应用程序通过 HTTP 请求正文接受 POST 数据
在我的处理程序中,我能够获取请求
def post(self):
data = self.request.body
我得到的数据以str(dictionary)的形式呈现。
有没有一种方法可以将这些数据以Python字典的形式接收?
我不想在服务器端使用eval
将此字符串转换为Python字典。
我的 Tornado 应用程序通过 HTTP 请求正文接受 POST 数据
在我的处理程序中,我能够获取请求
def post(self):
data = self.request.body
我得到的数据以str(dictionary)的形式呈现。
有没有一种方法可以将这些数据以Python字典的形式接收?
我不想在服务器端使用eval
将此字符串转换为Python字典。
除了Eloim的答案,Tornado提供了tornado.escape来进行"HTML、JSON、URL以及其他字符的转义和反转义"。使用它应该可以帮助你得到想要的结果:
data = tornado.escape.json_decode(self.request.body)
你正在收到一个JSON字符串。 使用JSON模块对其进行解码。
import json
def post(self):
data = json.loads(self.request.body)
json.loads(self.request.body.decode('utf-8'))
。 - 3k-tornado.escape.json_decode(self.request.body)
,它会为你处理所有的解码。 - Will Stornado.escape
包装器对json.loads
进行编码意味着您将无法使用cls
或parse_...
kwargs自定义/覆盖JSONDecoder
。(这在使用互补的tornado.escape.json.encode
包装json.dumps
时更为严重,但在此处仍值得一提。) - cowbert我在解析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))
urllib.parse.unquote_plus()
。 - NuclearPeon data = json.decode(self.request.body)
v = data.get(key)
self.response.write(v)
data = json.decode(self.request.body)
v = data.get('postvalue')
self.response.write(v)
怎么样?
bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())
{ k : v[-1] for k, v in self.request.arguments.items() }
- Jeppe在Tornado内置的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`