微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。