【问题标题】:Tornado request.body龙卷风请求.body
【发布时间】:2013-05-03 07:57:54
【问题描述】:

我的 Tornado 应用程序通过 http 正文请求接受 POST 数据

在我的处理程序中,我能够得到请求

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

我得到的数据在 str(dictionary) 的 from 中

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

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

【问题讨论】:

  • 可能是JSON字符串。
  • 有没有办法在不使用 eval 的情况下将此 json 字符串转换为 python 字典。
  • 此json字符串包含空格,其他json库无法将其转换为python字典
  • 你能发个样本吗?
  • { \n \"_id\" : \"cd4cca2_9vg5jyuwqxgmxfr\", \n \"time\" : '2012-01-01', \n \"opening_type\" : \"召回\", \n }"

标签: python python-2.7 tornado


【解决方案1】:

作为 Eloim 答案的替代方案,Tornado 为“转义/取消转义 HTML、JSON、URL 和其他”提供了 tornado.escape。使用它应该会给你你想要的东西:

data = tornado.escape.json_decode(self.request.body)

【讨论】:

  • 这对我不起作用 - 我收到错误:在 json_decode return json.loads(to_basestring(value)) File "/usr/lib/python3.6/json/__init__.py" ,第 354 行,在加载中返回 _default_decoder.decode(s) 文件“/usr/lib/python3.6/json/decoder.py”,第 339 行,在解码 obj 中,end = self.raw_decode(s, idx=_w( s, 0).end()) 文件“/usr/lib/python3.6/json/decoder.py”,第 357 行,在 raw_decode 从 None json 中引发 JSONDecodeError("Expecting value", s, err.value)。解码器.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)
【解决方案2】:

您正在接收一个 JSON 字符串。 使用 JSON 模块对其进行解码

import json

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

欲了解更多信息:http://docs.python.org/2/library/json.html

【讨论】:

  • 在 Python3 中,您必须解码原始字节串,例如。 json.loads(self.request.body.decode('utf-8'))
  • 您现在可以使用tornado.escape.json_decode(self.request.body),它将为您处理所有解码。
  • 请注意,使用tornado.escape 包装器到json.loads 意味着您将无法使用cls 或parse_... kwargs 自定义/覆盖JSONDecoder。 (使用包装json.dumps 的补充tornado.escape.json.encode 是一个更大的问题。但在这里仍然值得一提。)
【解决方案3】:

我想我在 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))

【讨论】:

  • 我很好奇答案是什么,所以让我知道这是否有帮助(或者如果您在聊天中发现了它)。我几乎可以肯定这是因为它是 url 编码的。
  • 这里的转义帮助了我。
  • 对于python3,它是urllib.parse.unquote_plus()
【解决方案4】:

如果您使用的是 WebApp2,它会使用自己的 json extras。 (解码) 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)

【讨论】:

    【解决方案5】:

    怎么样

    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() }
    【解决方案6】:

    我在内置龙卷风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`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多