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();
之类的内容来手动覆盖它,其中 e
是JQUERY
的操作中的匿名函数。另一方面,在 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
}
我的应用程序接受来自 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
:
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();
之类的内容来手动覆盖它,其中 e
是JQUERY
的操作中的匿名函数。另一方面,在 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
}