我正在尝试使用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();的值来自输入文本字段:

$('<div class="input-group col-sm-7"><input type="text" form="task" class="form-control" id="addProject" name="projectAdd" value="" placeholder="New tag">
<button type="submit" name="addTag" value="addTag" form="task" id="addTask"></button>  </div>').appendTo('#proj');


在我的龙卷风服务器中,我有:

 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,而不是输入文本字段的值。

最佳答案

数据在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中您settings中的run_server.py。在这种情况下,ajax请求本身将被Tornado阻止(您将在控制台上看到400 Bad Request)。

为解决这个问题,“ doc令牌可以通过名为XSRFHTTP标头传递。” $.cookie plugin说。通过X-XSRFToken通过包含或调用该get逻辑的任何页面的ajax设置cookie。这样做,医生说,“足以将cookie设置为副作用”:

class PageHandler(tornado.web.RequestHandler):
    def get(self):
        self.xsrf_token
        self.render('page.html')


然后可以在客户端中获取cookie(在这里通过jQuery sample chat app):

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


将令牌作为自定义self.xsrf_token参数嵌入到调用中:

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


或者,您也可以将其作为headers中的字段之一。 (并且,如果您要将JavaScript对象作为字段之一data,则应ajax为了在服务器端重新获得结构良好的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引用的中管理dict的示例。

关于jquery - Tornado 无法读取json ajax请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26896679/

10-11 22:48
查看更多