如何解决Django - 403禁止:CSRF 令牌丢失或 Ajax 调用不正确什么都试过了
我知道这是一个陈旧的问题,我在网上和这个网站上搜索了无数答案,这些答案归结为完全相同的解决方案,但没有一个对我有用,我不知道为什么。到目前为止我的信息/试验:
- 令人惊讶的是
csrf_exempt
装饰器不起作用 - 尝试在所有
Ajax
调用之前设置 Headers/beforeSend 一次,但不起作用(我尝试在调用中设置标头,并为所有ajax
调用设置一次) - 我可以通过
django
或 djangojavascript
轻松获取{{ token }}
令牌 -
django.middleware.csrf.CsrfViewMiddleware
出现在settings.py
python 3.8; django 2.2
- [更新] 我也尝试删除
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 举报,一经查实,本站将立刻删除。