如果您使用的是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请求中,请将令牌内插到页面中的某个位置;在
<meta>标题或生成的Javascript中,然后设置
X-CSRFToken标题。使用jQuery时,请使用
ajaxSetuphook。
使用元标记的示例(来自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(数据将最终在
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知道如何处理响应。



