使用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,请参阅此答案。)
也可能是_xsrf_cookies: True
在你的settings
中在run_server.py
中。如果是这种情况,ajax
请求本身将被Tornado阻止(您将在控制台上看到400 Bad Request
)。
为了解决这个问题,"XSRF
令牌可能……通过一个名为X-XSRFToken
的HTTP
头传递,"该文档说道。通过self.xsrf_token
,通过包含或调用ajax
逻辑的任何页面的get
设置cookie。医生说,这样做"就足以让饼干产生副作用":
class PageHandler(tornado.web.RequestHandler):
def get(self):
self.xsrf_token
self.render('page.html')
然后可以在客户端中获取cookie(此处通过jQuery$.cookie插件):
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对象作为字段之一,则应该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
的示例。
我认为您需要发送一个JSON字符串作为数据,而不是对象。请尝试JSON.stringfy({projectAddd:add}),而不仅仅是对象。