Python Tornado请求JSON

2024-04-19 21:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序接受来自POST方法的数据,我正在通过JQuery的AJAX请求运行POST方法。我发送的是JSON格式的数据,但在处理程序中,当我接受请求并访问数据时,结果是字节字符串类型

我正在使用my_body = self.request.body方法

例如,如果我正在发送{"drzava":"rs","kategorija":"general"},则收到的数据看起来像b'drzava=rs&kategorija=general'

问题是,之后我不能用tornado.escape.json_decode()来制作字典。我不断得到以下错误:

Traceback (most recent call last):
  File "/home/stefan/.local/lib/python3.6/site-packages/tornado/web.py", line 1697, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File "main.py", line 164, in post
    telo_json = tornado.escape.json_decode(telo)
  File "/home/stefan/.local/lib/python3.6/site-packages/tornado/escape.py", line 83, in json_decode
    return json.loads(to_basestring(value))
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

如果需要,我会发布代码


Tags: 数据方法inpyselfjsonvaluelib
2条回答

更新:首先,我的.js文件中有一个输入错误,因此AJAX请求没有被发送。其次,Tornado正在检测默认的POST方法(而不是AJAX的方法),因此您必须手动重写它,比如说e.preventDefault();,其中eJQUERY操作中匿名函数的参数。另一方面,在龙卷风中,self.request.body的结果类似于b'{"country":"rs","category":"sports"}',可以使用tornado.escape.json_decode()将其转换为字典。非常感谢@Ionut Ticus提出的建设性建议

因此,经过一点调查和阅读文档,我发现:

HTTPServerRequest.body is now always a byte string (previously the default empty body would be aunicode string on python 3)

这是龙卷风的官方文件。 Tornado Documentation Release 6.0.4 page 183

霍维沃,我找到了一个解决办法

argumenti = self.request.arguments
drzava_val = argumenti['drzava'][0].decode("utf-8")
kategorija_val =  argumenti['kategorija'][0].decode("utf-8")

data = {
            'drzava': drzava_val,
            'kategorija': kategorija_val
        }

您在Tornado服务器应用程序中接收的数据取决于客户端如何“打包”数据

您可以拥有application/x-www-form-urlencoded数据(似乎是您上面的情况),您可以使用get_body_argument在Tornado中处理这些数据:

drzava = self.get_body_argument("drzava", None)
kategorija = self.get_body_argument("kategorija", None)

或者您可以有application/json(似乎是您想要的):

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

为了从浏览器发送JSON数据,您需要实际发送JSON数据,并指定内容类型:

var data = {"drzava":"rs", "kategorija":"general"};
$.ajax({
    url: YOUR_URL,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    ...

编辑:
最后的问题是,HTML页面使用表单发送数据,实际上不会使用JS代码

相关问题 更多 >