Python 龙卷风请求 JSON

Python Tornado request JSON

我的应用程序接受来自 POST 方法的数据,我是 运行 通过 JQuery 的 AJAX 请求。我正在发送 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)

如果需要,我会post代码。

您在 Tornado 服务器应用程序中收到的数据取决于客户端 "packaged" 如何处理您的数据。

您可能有 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 代码。

更新: 首先,我的 .js 文件中有一个拼写错误,所以 AJAX 请求没有正在发送。其次,Tornado 正在检测默认的 POST 方法(不是 AJAX 的方法),因此您必须通过说 e.preventDefault(); 之类的内容来手动覆盖它,其中 eJQUERY 的操作中的匿名函数。另一方面,在 Tornado 中,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的官方文档写的。 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
        }