Tornado无法读取json ajax请求

2024-09-25 00:34:15 发布

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

使用ajax我试图将数据发送到我的Tornado服务器,这是我的JQuery:

$("#addTask").submit(function(e){
    e.preventDefault();
    var add = $('#addProject').val();
    var added={projectAdded:add};
      $.post("/task",
              JSON.stringify(added),
        function(data){
            window.location.reload(true);
              });
    });

$('#addProject').val();的值来自输入文本字段:

^{pr2}$

在我的Tornado服务器中,我有:

 class TaskAddHandler(BaseHandler):
    def post(self):
        addProj = json.loads(self.request.body)       
        print 'NEW TASK', addProj

但这给了我一个错误:raise ValueError("No JSON object could be decoded") ValueError: No JSON object could be decoded,而不是输入文本字段的值。在


Tags: no文本self服务器addjsonaddedvar
2条回答

我认为您需要发送一个JSON字符串作为数据,而不是对象。尝试JSON.stringify({pro添加对象:添加})而不仅仅是对象。在

数据位于self.request.arguments。此外,还需要向客户端返回有效的json。在

class AjaxHandler(tornado.web.RequestHandler):

    def post(self):
        my_data = self.request.arguments['test_data']
        # do something with my_data 
        self.write(json.dumps({'status': 'ok'}))
        self.finish()

处理程序的self.write(json.dumps({'status': 'ok'}))响应对于完成与客户机的事务是必需的:任何有效的json都可以;内容是什么并不重要。(如果客户机似乎没有取回json,请参阅this answer。)

也可能是_xsrf_cookies: True在你的settingsrun_server.py。如果是这样,ajax请求本身将被Tornado阻止(您将在控制台上看到400 Bad Request)。在

为了解决这个问题,XSRF令牌可能。。。通过名为HTTPHTTP头传递,doc表示。通过get的页面包含或调用ajax逻辑的get设置cookie。医生说,这样做“足以将cookie设置为副作用”:

^{pr2}$

然后可以在客户机中获取cookie(这里通过jQuery$.cookie plugin):

var token = $.cookie('_xsrf');

在调用中嵌入标记作为自定义headers参数:

$.ajax({
    url: '/task',
    headers: {'X-XSRFToken' : token },
    data: {'test_string': 'test success'},
    dataType: "JSON",
    type: "POST",
    success: function ( data , status_text, jqXHR) {
        alert('ajax success')
    },
    error: function ( data , status_text, jqXHR ) {
        alert('ajax fail')
    },
});

或者,也可以将其作为data中的一个字段。(如果您要ajax将一个JavaScript对象作为一个字段,那么为了在服务器端获得一个结构良好的dict,您应该JSON.stringify它):

var packet = {"_xsrf": $.cookie("_xsrf"), "test_string": "test success", "js_obj": JSON.stringify(js_obj)}; 

$.ajax({
    url: '/task',
    data: packet,
    dataType: "JSON",
    type: "POST",
    success: function ( data , status_text, jqXHR) {
        alert('ajax success')
    },
    error: function ( data , status_text, jqXHR ) {
        alert('ajax fail')
    },
});

还有一个在doc中引用的sample chat app中管理_xsrf_cookies的示例。在

相关问题 更多 >