小编典典
如果您使用的是Flask-WTF CSRF保护,则需要免除您的视图或将CSRF令牌也包含在AJAX POST请求中。
豁免是通过装饰器完成的:
@csrf.exempt
@app.route("/json_submit", methods=["POST"])
def submit_handler():
# a = request.get_json(force=True)
app.logger.log("json_submit")
return {}
要将令牌包含在AJAX请求中,请将令牌内插到页面中的某个位置;在标题或生成的JavaScript中,然后设置X-CSRFToken标题。使用jQuery时,请使用ajaxSetuphook。
使用元标记的示例(来自Flask-WTF CSRF文档):
在您的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(数据将最终在request.formFlask一侧);您必须将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) {
})
现在的数据可以作为一个Python结构与访问request.get_json()方法。
在dataType: "json",对参数$.ajax时,你的看法是只需要 返回
JSON(例如,你使用flask.json.jsonify()产生JSON响应)。它使jQuery知道如何处理响应。
2020-07-26