[英]Django 1.9 AJAX form CSRF token 403 error - “CSRF cookie not set”
我已经在SO上看到了很多,但没有什么能解决我的问题。
问题:
启用CSRF中间件后,Django在AJAX表单请求上响应403,说明:
“未设置CSRF cookie。”
在文档之后 ,实现了一个JS功能,它设置了自定义的“X-CSRFToken”标头。
它按预期工作,从浏览器获取“csrftoken” cookie并将其与AJAX请求一起发布:
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
但回应仍然是403。
尝试的解决方案:
我已经尝试过在SO或网上找到的所有内容,特别是:
检查是否启用了中间件:
MIDDLEWARE_CLASSES = [ ... 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... ]
启用了Cookie的不同浏览器;
用@ensure_csrf_cookie
装饰我的观点;
在我的模板中设置{% csrf_token %}
;
使用获取正确请求上下文的render
快捷方式
在我的settings.py
设置自定义CSRF_COOKIE_NAME
和CSRF_HEADER_NAME
;
明确设置CSRF_COOKIE_SECURE = False
和CSRF_COOKIE_HTTPONLY = False
;
明确设置CSRF_TRUSTED_ORIGINS
设置;
测试开发和生产服务器;
甚至request.META["CSRF_COOKIE_USED"] = True
在我看来是request.META["CSRF_COOKIE_USED"] = True
,正如有人建议的那样。
仍然一无所获。
头:
如果我在我的视图中使用@csrf_exempt
和print(request.META)
,很明显请求中存在自定义标题“X-CSRFToken” ,并根据Django文档格式化,带有“HTTP_”前缀,用下划线替换连字符,全部大写: “HTTP_X_CSRFTOKEN” 。
更重要的是,它的价值与Django设置的cookie相匹配。
饼干:
奇怪的是,如果我尝试在我的视图中print(request.COOKIES)
,在页面和表单加载上我可以看到“csrftoken” cookie,但字典在AJAX请求时是空的 。 这可能是问题吗?
不顾一切地发现实际上是错的。 谢谢您阅读此篇。
好的,问题很简单:
默认情况下,Fetch API不会发送凭据。 据MDN称 :
Request接口的凭证只读属性指示用户代理是否应在跨源请求的情况下从其他域发送cookie。 这类似于XHR的withCredentials标志,但有三个可用值。
默认为omit
,它永远不会发送cookie。 您只需要在fetch()
函数参数中添加same-origin
:
fetch(formUrl, {
...
credentials: 'same-origin',
...
})
你会很高兴去:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.