在ajax POST中的Django csrf(csrf cookie在{{csrf}}使用之前未设置)

时间:2015-03-19 15:28:11

标签: python ajax django cookies csrf

我的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,如果不是组?感谢。

1 个答案:

答案 0 :(得分:0)

您可以随时在模板中的任意位置删除{% csrf_token %}隐藏的表单字段,如果尚未设置Cookie,则按名称选择。您不必将其放在表单标记内作为有效的HTML。

只需将您的逻辑更改为:

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

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