Django csrf ajax仅在生产中失败

Django csrf ajax仅在生产中失败,ajax,django,csrf,Ajax,Django,Csrf,据我所知,我已经把一切都安排好了,并且在开发过程中发挥了作用: 我包含了以下代码: function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.leng

据我所知,我已经把一切都安排好了,并且在开发过程中发挥了作用:

我包含了以下代码:

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
函数getCookie(名称){ var-cookieValue=null; if(document.cookie&&document.cookie!=''){ var cookies=document.cookie.split(“;”); 对于(变量i=0;i
这在开发中有效而在生产中无效的原因可能是什么?

一个可能的原因可能是您的生产设置中有CSRF\u COOKIE\u SECURE=True。这将仅使用HTTPS连接发送cookie。如果您已启用此功能,但希望视图在不使用CSRF令牌的情况下处理POST请求,请使用装饰视图

编辑:还要检查会话\u COOKIE\u安全是否已启用。如果设置为True,则可能会遇到此问题

我遇到了一个类似的问题,通过将登录用户(Django管理员页面)的URL移动到仅通过HTTPS提供服务,从而消除了后一种设置的需要,从而解决了这个问题。我仍然保留CSRF_COOKIE_SECURE=True,以及处理POST请求(set_语言)所需的单个URL,并使用@CSRF_export包装,以便它可以绕过此设置。这意味着任何需要处理匿名会话表单的视图也需要进行类似的修饰


目前看来一切正常,但我仍在研究我的配置是否还有其他安全隐患。另外,可能有更好的方法来处理这个问题。在那之前,我可以接受这种方法。HTH.

在我的情况下,以下解决了问题:

@ensure_csrf_cookie
def your_view(request)
根据文档,如果没有包含{%csrf_token%}的表单,则可能不会设置csrf cookie


您是否确认该代码确实包含在生产中?你能在开发工具中看到它吗?在部署静态文件后,我很多次忘记运行
collectstatic
。是的,它肯定包括在内。我刚刚在控制台中键入了
getCookie('csrftoken')
,它返回了
null
这是怎么回事?当你说它失败时,你得到的确切失败是什么?呼叫未触发,从服务器返回错误,等等?当您未发送csrftoken
CSRF验证失败时,我会收到您收到的消息。请求被中止。
我刚刚在控制台中键入了
document.cookie.indexOf('csrftoken')
,它返回了
-1
,因此由于某种原因cookie不存在,这是什么原因造成的?使用浏览器的开发工具或
curl-I
仔细检查cookie是否正在发送。例如,如果JavaScript无法读取cookie,并且它不会出现在
文档中。cookie
。在我的答案周围找到另一条线索,