Jquery Tornado无法读取json ajax请求

Jquery Tornado无法读取json ajax请求,jquery,python,tornado,Jquery,Python,Tornado,我试图使用ajax将数据发送到Tornado服务器,这是我的JQuery: $("#addTask").submit(function(e){ e.preventDefault(); var add = $('#addProject').val(); var added={projectAdded:add}; $.post("/task", JSON.stringify(added), function(data){

我试图使用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');
但这给了我一个错误:raisevalueerror无法解码任何JSON对象
ValueError:无法解码JSON对象,而不是输入文本字段的值。

我认为需要发送JSON字符串作为数据,而不是对象。尝试JSON.stringify{projectAdded:add},而不仅仅是对象。

我认为您需要发送JSON字符串作为数据,而不是对象。尝试JSON.stringify{projectAdded:add},而不仅仅是对象。

数据位于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.writejson.dumps{'status':'ok'}响应是完成与客户端的事务所必需的:任何有效的json都可以;内容是什么并不重要。查看客户机是否没有返回json

在run_server.py中的设置中,也可能是xsrf_cookies:True。如果是这种情况,ajax请求本身将被Tornado阻止,您将在控制台上看到400个错误请求

为了解决这个问题,XSRF令牌可能。。。可以通过名为X-XSRFToken的HTTP头进行传递。通过self.xsrf_令牌,通过获取包含或调用ajax逻辑的任何页面来设置cookie。医生说,这样做足以将cookie设置为副作用:

class PageHandler(tornado.web.RequestHandler):
    def get(self):
        self.xsrf_token
        self.render('page.html')
然后可以通过jQuery在客户机中获取cookie:

将令牌作为自定义标头参数嵌入调用中:

$.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')
    },
});
或者,您也可以将其作为数据中的字段之一。如果将JavaScript对象作为字段之一进行ajaxing,则应将其JSON.stringify,以便在服务器端获得结构良好的dict:

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')
    },
});
还有一个在中管理_xsrf_cookies的示例。

数据位于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.writejson.dumps{'status':'ok'}响应是完成与客户端的事务所必需的:任何有效的json都可以;内容是什么并不重要。查看客户机是否没有返回json

在run_server.py中的设置中,也可能是xsrf_cookies:True。如果是这种情况,ajax请求本身将被Tornado阻止,您将在控制台上看到400个错误请求

为了解决这个问题,XSRF令牌可能。。。可以通过名为X-XSRFToken的HTTP头进行传递。通过self.xsrf_令牌,通过获取包含或调用ajax逻辑的任何页面来设置cookie。医生说,这样做足以将cookie设置为副作用:

class PageHandler(tornado.web.RequestHandler):
    def get(self):
        self.xsrf_token
        self.render('page.html')
然后可以通过jQuery在客户机中获取cookie:

将令牌作为自定义标头参数嵌入调用中:

$.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')
    },
});
或者,您也可以将其作为数据中的字段之一。如果将JavaScript对象作为字段之一进行ajaxing,则应将其JSON.stringify,以便在服务器端获得结构良好的dict:

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

还有一个在中提到的中管理_xsrf_cookies的示例。

谢谢,我尝试过这样做,但仍然会出现相同的错误好的,看看jQuery文档,它看起来像JSON.stringify是没有必要的,大概jQuery会自动将对象转换为JSON。您可能正在使用Python3吗?当我将Tornado项目从Python2切换到Python3时,我不得不将.decode添加到self.request.body中,因为Tornado正在读取字节,而json.loads需要一个字符串,而Python3中的字符串是unicode,而不是字节。但是,我得到了一个与您看到的不同的错误,所以可能不是这样。谢谢我尝试过这样做,但它仍然会产生相同的错误好的,查看jQuery文档,它看起来像JSON。无论如何,stringify不是必需的,大概jQuery会自动将对象转换为JSON。您可能正在使用Python3吗?当我将Tornado项目从Python2切换到Python3时,我不得不将.decode添加到self.request.body中,因为Tornado正在读取字节,而json.loads需要一个字符串,而Python3中的字符串是unicode,而不是字节。但是,我得到的错误与您看到的不同,因此可能不是这样。