ajax POST 中的 Django csrf(直到使用 {{csrf}} 才设置 csrf cookie)

Django csrf in ajax POST (csrf cookie not set until {{csrf}} used)

我的 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,如果不是的话放?谢谢

如果尚未设置 cookie,您可以随时将 {% csrf_token %} 隐藏的表单域放在模板中的任何位置,然后按名称选取它。您不必将它放在表单标签内才有效 HTML.

只需将您的逻辑更改为:

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

那当然要看getCookie returns.