真正的解决方案
好的,我设法找出问题所在。它位于Javascript(正如我在下面建议的)代码中。
您需要的是:
$.ajaxSetup({ beforeSend: function(xhr, settings) { 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 = depreURIComponent(cookie.substring(name.length + 1)); break; } } } return cookievalue; } if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { // only send the token to relative URLs i.e. locally. xhr.setRequestHeader("X-CSRFToken", getcookie('csrftoken')); } } });而不是官方文档中发布的代码:https:
//docs.djangoproject.com/en/2.2/ref/csrf/
工作代码来自以下Django条目:http
:
//www.djangoproject.com/weblog/2011/feb/08/security/
因此,一般的解决方案是:“使用ajaxSetup处理程序而不是ajaxSend处理程序”。我不知道为什么行得通。但这对我有用:)
以前的帖子(无答案)
我实际上遇到了同样的问题。
它在更新到Django 1.2.5之后发生-在Django 1.2.4中AJAX POST请求没有错误(AJAX不受任何保护,但效果很好)。
就像OP一样,我尝试了Django文档中发布的Javascript代码段。我正在使用jQuery 1.5。我也在使用“
django.middleware.csrf.CsrfViewMiddleware”中间件。
我尝试遵循中间件代码,但我知道它在此方面失败:
request_csrf_token = request.meta.get('HTTP_X_CSRFTOKEN', '')然后
if request_csrf_token != csrf_token: return self._reject(request, REASON_BAD_TOKEN)
此“如果”为true,因为“ request_csrf_token”为空。
基本上,这意味着未设置标头。那么此JS行有什么问题吗:
xhr.setRequestHeader("X-CSRFToken", getcookie('csrftoken'));?
我希望提供的详细信息将有助于我们解决问题:)



