Django - 403禁止:CSRF 令牌丢失或 Ajax 调用不正确什么都试过了

问题描述

我知道这是一个陈旧的问题,我在网上和这个网站上搜索了无数答案,这些答案归结为完全相同的解决方案,但没有一个我有用,我不知道为什么。到目前为止我的信息/试验:

  1. 令人惊讶的是 csrf_exempt 装饰器不起作用
  2. 尝试在所有 Ajax 调用之前设置 Headers/beforeSend 一次,但不起作用(我尝试在调用中设置标头,并为所有 ajax 调用设置一次)
  3. 我可以通过 django 或 django javascript 轻松获取 {{ token }} 令牌
  4. django.middleware.csrf.CsrfViewMiddleware 出现在 settings.py
  5. python 3.8; django 2.2
  6. [更新] 我也尝试删除 contentType 也无济于事

在下面您可以看到 /*...*/

中的不同试验
var csrftoken = '{{ csrf_token }}'

$.ajaxSetup({
  crossDomain: false,beforeSend: function(xhr,settings) {
      xhr.setRequestHeader("X-CSrftoken",csrftoken)
  }
});

$.ajax({
  url: '/do_things/',type: 'POST',contentType: 'application/json',data: {
    /*'csrfmiddlewaretoken': csrftoken*/
  },beforeSend: function (xhr) {
      /*xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');*/
      /*xhr.setRequestHeader('X-CSrftoken',csrftoken);*/
      /*xhr.setRequestHeader('X-CSRF-Token',csrftoken);*/
  },headers: {
      /*'X-CSrftoken': csrftoken,*/
      /*'X-CSRF-Token': csrftoken*/
  },success: function (data) {
    console.log('Fill all the tables')
  }
})

在视图侧

@login_required(login_url='/login/')
def do_things(request):
    if request.method == "POST":
        ...

url 方面(以防我在这里搞砸了):

urlpatterns = [
    #...
    path('r/',views.do_things,name='do_things'),]

资源:

a) Forbidden (CSRF token missing or incorrect.) | Django and AJAX

b) Adding CSRFToken to Ajax request

c) https://docs.djangoproject.com/en/2.2/ref/csrf/

解决方法

let csrftoken = '{{ csrf_token }}'
$.ajax({
    type: "POST",headers:{'X-CSRFToken':csrftoken},url: "{% url 'Wishlist' %}",data: {'product_id':product_id},success: function (response) {
        console.log(response,typeof(response))
    }
})

我在标头中使用了带有 csrf 的简单 ajax,它工作正常。

当我在我的代码中使用您的代码时,因此函数调用但数据变为空白。我参考了这个Django csrf token for Ajax