我正在编写一个基于 flask 的小型站点,我想使用 Ajax 将数据从客户端发送到服务器。到目前为止,我只使用 Ajax 请求从服务器检索数据。这次我想通过 POST 请求提交数据。
这是 flask 端的接收器,我将其简化为几乎不记录消息以避免在此路由的实现中出现任何不必要的错误:
@app.route("/json_submit", methods=["POST"])
def submit_handler():
# a = request.get_json(force=True)
app.logger.log("json_submit")
return {}
提交ajax请求时,flask给我一个400错误
127.0.0.1 - - [03/Apr/2014 09:18:50] "POST /json_submit HTTP/1.1" 400 -
我也可以在浏览器的 Web 开发者控制台中看到这个
为什么flask没有使用请求中提供的数据调用submit_handler
?
var request = $.ajax({
url: "/json_submit",
type: "POST",
data: {
id: id,
known: is_known
},
dataType: "json",
})
.done( function (request) {
})
最佳答案
如果您使用的是 Flask-WTF CSRF protection您还需要豁免您的 View 或在您的 AJAX POST 请求中包含 CSRF token 。
使用装饰器进行豁免:
@csrf.exempt
@app.route("/json_submit", methods=["POST"])
def submit_handler():
# a = request.get_json(force=True)
app.logger.log("json_submit")
return {}
要在 AJAX 请求中包含 token ,请将 token 插入到页面中的某处;在 <meta>
header 或在生成的 JavaScript 中,然后设置 X-CSRFToken
标题。使用 jQuery 时,请使用 ajaxSetup
hook .
使用元标记的示例(来自 Flask-WTF CSRF 文档):
<meta name="csrf-token" content="{{ csrf_token() }}">
在你的 JS 代码中某处:
var csrftoken = $('meta[name=csrf-token]').attr('content')
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
您的处理程序实际上还没有发布 JSON 数据;它仍然是一个常规的 url 编码 POST
(数据将在 Flask 端以 request.form
结束);您必须将 AJAX 内容类型设置为 application/json
并使用 JSON.stringify()
实际提交 JSON:
var request = $.ajax({
url: "/json_submit",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
id: id,
known: is_known
}),
})
.done( function (request) {
})
现在可以使用 request.get_json()
method 作为 Python 结构访问数据.
dataType: "json",
$.ajax
的参数仅当您的 View 返回 JSON(例如,您使用 flask.json.jsonify()
生成 JSON 响应)时才需要。它让 jQuery 知道如何处理响应。
关于javascript - Flask 和 Ajax 发布 HTTP 400 错误请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854749/