我已经在SO上看到了很多,但没有什么能解决我的问题.
问题:
启用CSRF中间件后,Django在AJAX表单请求上响应403,说明:
"未设置CSRF cookie."
在文档之后,实现了一个JS功能,它设置了自定义的"X-CSRFToken"标头.
它按预期工作,从浏览器获取"csrftoken" cookie并将其与AJAX请求一起发布:
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
Run Code Online (Sandbox Code Playgroud)
但回应仍然是403.
尝试的解决方案:
我已经尝试过在SO或网上找到的所有内容,特别是:
检查是否启用了中间件:
MIDDLEWARE_CLASSES = [
...
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
]
Run Code Online (Sandbox Code Playgroud)启用了Cookie的不同浏览器;
装饰我的观点@ensure_csrf_cookie;
{% csrf_token %}在我的模板中设置;
使用render获取正确请求上下文的快捷方式
设置自定义CSRF_COOKIE_NAME和CSRF_HEADER_NAME我的settings.py;
明确地设定CSRF_COOKIE_SECURE = False和CSRF_COOKIE_HTTPONLY = False;
明确CSRF_TRUSTED_ORIGINS设定;
测试开发和生产服务器;
即便request.META["CSRF_COOKIE_USED"] = True在我看来,正如有人建议的那样.
仍然一无所获.
头:
如果我使用@csrf_exempt并print(request.META)在我的视图中,很明显自定义标题"X-CSRFToken"存在于请求中并根据Django文档格式化,带有"HTTP_"前缀,用下划线替换连字符,全部大写:"HTTP_X_CSRFTOKEN".
更重要的是,它的价值与Django设置的cookie相匹配.
饼干:
奇怪的是,如果我尝试print(request.COOKIES)在我的视图中,在页面和表单加载上我可以看到 …