Jquery POST JSON数据到Python后端

时间:2015-01-11 10:24:36

标签: javascript jquery python json tornado

我想将一些数据从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"}

你能帮我解决我做错的事吗?

1 个答案:

答案 0 :(得分:3)

request.arguments只能用于表单编码数据。使用request.body访问JSON原始数据并使用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正文:

$.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);
    }
});

并在尝试将POST解码为JSON之前验证您的Tornado POST处理程序中是否正在使用该内容类型:

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))

只有在将JSON从Python返回给jQuery时才需要$.ajax dataType参数;它告诉jQuery为你解码响应。即使这样,也不是严格要求的,因为application/json响应Content-Type标头就足够了。