【问题标题】:Django csrf in ajax POST (csrf cookie not set until {{csrf}} used)ajax POST 中的 Django csrf(在使用 {{csrf}} 之前未设置 csrf cookie)
【发布时间】:2015-05-22 19:23:24
【问题描述】:

我的 django 应用程序使用 ajax 将商品添加到购物车。 ajax请求方式为POST,我通过js开启请求头:

var csrftoken = getCookie('csrftoken');

$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

问题是,我不是从表单发送请求,而只是使用按钮和 onClick 事件,所以我不在模板中使用 {{ csrf }}。所以,cookie 没有设置,直到我访问另一个页面(例如,登录页面)。我应该使用表单(这不是一个好主意,因为我在一个页面上有很多项目,并且为每个项目创建了带有 csrf 令牌的表单),或者有一种方法可以手动设置 csrf cookie,如果不是放?谢谢。

【问题讨论】:

    标签: python ajax django cookies csrf


    【解决方案1】:

    如果尚未设置 cookie,您可以随时将 {% csrf_token %} 隐藏表单字段放在模板中的任何位置,然后按名称选择它。您不必将其放在表单标签中即可成为有效的 HTML。

    只需将您的逻辑更改为:

    var csrftoken == getCookie('csrftoken') || $(":input[name='csrfmiddlewaretoken']").val();
    

    这当然取决于getCookie 返回的内容。

    【讨论】:

    • 谢谢!那很容易。我使用输入和 jqery 选择器来获取价值。现在不需要 getCookie()。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2017-05-05
    • 2020-12-05
    • 2021-06-10
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多