Jquery POST JSON 数据到 Python 后端
Jquery POST JSON data to Python backend
我想将一些数据从 jQuery 发送到 Tornado Python 后端。
这是一个简单的例子:
$.ajax({
url: '/submit_net',
dataType: 'json',
data: JSON.stringify({"test_1":"1","test_2":"2"}),
type: 'POST',
success: function(response) {
console.log(response);
},
error: function(error) {
console.log(error);
}
});
这里是 Python 代码:
class submit_net(tornado.web.RequestHandler):
def post(self):
data_json = self.request.arguments
print data_json
当我单击 提交 按钮时,Python 后端会检索以下字典
{'{"test_1":"1","test_2":"2"}': ['']}
但我想检索与 jQuery 发送的完全相同的字典:
{"test_1":"1","test_2":"2"}
你能帮我看看我做错了什么吗?
request.arguments
应该只用于 形式的编码数据 。使用 request.body
to access the JSON raw data and decode with the json
module:
import json
data_json = self.request.body
data = json.loads(data_json)
request.body
包含 bytes,这在 Python 2 中很好,但是如果你使用 Python 3,你需要解码那些首先到 Unicode。使用 cgi.parse_header()
:
获取请求 character-set
from cgi import parse_header
content_type = self.request.headers.get('content-type', '')
content_type, params = parse_header(content_type)
charset = params.get('charset', 'UTF8')
data = json.loads(data_json.decode(charset))
默认为UTF-8字符集,默认只对JSON请求有效;其他请求内容类型需要以不同方式处理。
您可能希望通过设置内容类型来表明您正在发送 JSON body:
$.ajax({
url: '/submit_net',
contentType: "application/json; charset=utf-8",
data: JSON.stringify({"test_1":"1","test_2":"2"}),
type: 'POST',
success: function(response) {
console.log(response);
},
error: function(error) {
console.log(error);
}
});
并在您的 Tornado POST 处理程序中验证正在使用该内容类型,然后再尝试将 POST 解码为 JSON:
content_type = self.request.headers.get('content-type', '')
content_type, params = parse_header(content_type)
if content_type.lower() != 'application/json':
# return a 406 error; not the right content type
# ...
charset = params.get('charset', 'UTF8')
data = json.loads(data_json.decode(charset))
仅当您从 Python 返回 JSON 返回 jQuery 时才需要 $.ajax
dataType
参数;它告诉 jQuery 为您解码响应。即使那样,这也不是严格需要的,因为 application/json
响应 Content-Type header 就足够了。
我想将一些数据从 jQuery 发送到 Tornado Python 后端。
这是一个简单的例子:
$.ajax({
url: '/submit_net',
dataType: 'json',
data: JSON.stringify({"test_1":"1","test_2":"2"}),
type: 'POST',
success: function(response) {
console.log(response);
},
error: function(error) {
console.log(error);
}
});
这里是 Python 代码:
class submit_net(tornado.web.RequestHandler):
def post(self):
data_json = self.request.arguments
print data_json
当我单击 提交 按钮时,Python 后端会检索以下字典
{'{"test_1":"1","test_2":"2"}': ['']}
但我想检索与 jQuery 发送的完全相同的字典:
{"test_1":"1","test_2":"2"}
你能帮我看看我做错了什么吗?
request.arguments
应该只用于 形式的编码数据 。使用 request.body
to access the JSON raw data and decode with the json
module:
import json
data_json = self.request.body
data = json.loads(data_json)
request.body
包含 bytes,这在 Python 2 中很好,但是如果你使用 Python 3,你需要解码那些首先到 Unicode。使用 cgi.parse_header()
:
from cgi import parse_header
content_type = self.request.headers.get('content-type', '')
content_type, params = parse_header(content_type)
charset = params.get('charset', 'UTF8')
data = json.loads(data_json.decode(charset))
默认为UTF-8字符集,默认只对JSON请求有效;其他请求内容类型需要以不同方式处理。
您可能希望通过设置内容类型来表明您正在发送 JSON body:
$.ajax({
url: '/submit_net',
contentType: "application/json; charset=utf-8",
data: JSON.stringify({"test_1":"1","test_2":"2"}),
type: 'POST',
success: function(response) {
console.log(response);
},
error: function(error) {
console.log(error);
}
});
并在您的 Tornado POST 处理程序中验证正在使用该内容类型,然后再尝试将 POST 解码为 JSON:
content_type = self.request.headers.get('content-type', '')
content_type, params = parse_header(content_type)
if content_type.lower() != 'application/json':
# return a 406 error; not the right content type
# ...
charset = params.get('charset', 'UTF8')
data = json.loads(data_json.decode(charset))
仅当您从 Python 返回 JSON 返回 jQuery 时才需要 $.ajax
dataType
参数;它告诉 jQuery 为您解码响应。即使那样,这也不是严格需要的,因为 application/json
响应 Content-Type header 就足够了。