【问题标题】:Cannot unpack request JSON with CSRF on无法使用 CSRF 解压请求 JSON
【发布时间】:2018-02-08 16:06:52
【问题描述】:

只要设置了@csrf.exempt,Ajax 请求就可以被解包。一旦我将其注释掉,request.get_json(force=True) 就会失败。把它通过调试器: (Pdb) p request._cached_json 'Request' object has no attribute '_cached_json' 模板代码:

var csrf_token = "{{ csrf_token() }}";
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrf_token);
        }}});

发送请求:

save()
{
    $.post("/save", JSON.stringify({'name': 'aaa'}), accept_reply, "json");
} 

Flask 处理请求:

@app.route('/save', methods=("POST",))
#@csrf.exempt
def save():
    order_data = request.get_json(force=True)
    return jsonify({"status": "ok"})

@csrf.exempt 被注释掉时,request 没有属性_cached_jsonrequest.get_json(force=True) 引发异常,而request.get_json() 只返回 None。

【问题讨论】:

    标签: jquery ajax python-3.x flask csrf


    【解决方案1】:

    这里的问题是 Flask 需要一个 "Content-Type": "application/json" 标头来识别您正在发布一个 JSON 包,否则我相信它认为您正在发送 urlencoded 表单数据。

    如果我想将 JSON 数据发布到 Flask,我发现我不能使用任何 jQuery“便利”AJAX 方法。

    试试这个:

    $.ajax({
        type: "POST",
        url: "{{ url_for('.update_formulary_mb') }}",
        contentType: "application/json",
        data: JSON.stringify({id: state.config, update: records}),
        dataType: "json",
        success: function(response) {
            console.log(response);
        },
        error: function(err) {
            console.log(err);
        },
    });
    

    2017 年 9 月 1 日编辑

    事实证明,如果您的所有 XHR 请求都需要使用 jQuery 的 ajaxSetup() 方法的相同参数,那么您可以使用 jQuery post() 方法:

    $.ajaxSetup({
        contentType: "application/json"
    });
    

    这会将公共参数传递给 all ajax 和它使用范围内的派生方法...因此,如果您在所有 XHR 调用中都遵循相同的模式,它会很好地工作页面...

    【讨论】:

    • 谢谢,这行得通!但是,有一种调整 jQuery.post() 的规范方法:$.ajaxSetup({contentType: "application/json"})。 Ajax 设置也用于添加 X-CSRFToken,因此我可以轻松地使用 $.post() 来使用 Flask。
    • 好的,太好了!我将在答案中添加注释以捕获此问题...我从未见过 ajaxSetup() 方法...如果您的 XHR 请求都遵循类似的模式,那就太好了
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2014-06-22
    • 2019-10-27
    • 2016-05-06
    • 2017-04-06
    相关资源
    最近更新 更多