Javascript Django ajax 403,因为只有httponly cookie

Javascript Django ajax 403,因为只有httponly cookie,javascript,python,django,csrf,httponly,Javascript,Python,Django,Csrf,Httponly,我对Django的CSRF有一个奇怪的问题。以下是相关部分: 在我的javascript文件中,我有: function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < c

我对Django的CSRF有一个奇怪的问题。以下是相关部分:

在我的javascript文件中,我有:

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));
}

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

$.post('/api/jpush',
  $.param({'recipients': recipients, 'message': message, 'url': url,
           'url_title': url_title, 'priority': priority,
             'csrftoken': getCookie('csrftoken')}),
...
在我的模板中:

<form id="push" class="form-horizontal" action="" method="post">{% csrf_token %}
{%csrf\u令牌%}
然而,当我使用ajax发布时,我得到一个403,firebug向我显示crsftoken值为null,csrftoken cookie为httpOnly。在我的
settings.py
中,我已将
CSRF\u COOKIE\u HTTPONLY
设置为False,因此我不明白为什么COOKIE被强制为HTTPONLY。我正在使用Django 1.10


谢谢

所以我根据这里提到的kambiz找到了一个解决方案:

我将ajax参数部分修改为:

$.post('/api/jpush',
  $.param({'recipients': recipients, 'message': message, 'url': url,
           'url_title': url_title, 'priority': priority,
           'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()}),
...

这仍然不能回答为什么Django强制将csfr cookie作为httponly,但至少我可以继续使用代码,因此我根据这里提到的kambiz找到了一个解决方案:

我将ajax参数部分修改为:

$.post('/api/jpush',
  $.param({'recipients': recipients, 'message': message, 'url': url,
           'url_title': url_title, 'priority': priority,
           'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()}),
...

这仍然不能回答为什么Django强制将csfr cookie作为httponly,但至少我可以继续使用代码

在设置
CSRF\u cookie\u httponly=False之前,您是否只有一个http-only cookie。请尝试清除cookies并重试。是的,我已在我的
设置.py
文件中设置了cookies,我已多次清除cookies,但根据firebug,它始终返回为httponly。我尝试使用
文档查看cookie。cookie
也没有显示,这证实了firebug显示的内容。请确保您已重置服务器,然后在更改设置后清除cookie。我也尝试过,清除了浏览器缓存和cookie,重新启动了机器,django服务器,但没有效果。我也重新创建了我的virtualenv,尝试降级到Django 1.9,但到目前为止没有任何效果。在设置
CSRF\u cookie\u HTTPONLY=False
之前,您只有一个仅http的cookie。请尝试清除cookies并重试。是的,我已在我的
设置.py
文件中设置了cookies,我已多次清除cookies,但根据firebug,它始终返回为httponly。我尝试使用
文档查看cookie。cookie
也没有显示,这证实了firebug显示的内容。请确保您已重置服务器,然后在更改设置后清除cookie。我也尝试过,清除了浏览器缓存和cookie,重新启动了机器,django服务器,但没有效果。我也重新创建了我的virtualenv,尝试降级到Django 1.9,但到目前为止没有任何效果