我在无法使用基于cookie的CSRF令牌的环境中使用Django + Django REST Framework;因此,我必须使用CSRF_USE_SESSIONS = True
。
但是,DRF Web UI依赖于该cookie进行所有交互。看来这是通过读取csrftoken
cookie设置的,并在后续请求上设置了X-CSRFToken
标头,然后,如果请求正文中未包含隐藏字段,则django.middleware.csrf.CsrfViewMiddleware.process_view()
将使用它。此代码在rest_framework.templates.rest_framework.base.html
:]中设置
<script> window.drf = { csrfHeaderName: "{{ csrf_header_name|default:'X-CSRFToken' }}", csrfCookieName: "{{ csrf_cookie_name|default:'csrftoken' }}" }; </script>
不使用
POST
的DRF表单确实在表单主体中包含CSRF令牌,因此没有cookie意味着Web界面根本无法访问CSRF令牌,从而导致所有PUT
,PATCH
,并且DELETE
请求失败并返回403响应。
I believe
这是DRF中的错误,但是可能这是预期的行为。有人可以解释如何将DRF与CSRF_USE_SESSIONS = True
一起使用吗?我在无法使用基于cookie的CSRF令牌的环境中使用Django + Django REST Framework;因此,我必须使用CSRF_USE_SESSIONS = True运行。但是,DRF Web UI取决于此...
此内容已在https://github.com/encode/django-rest-framework/pull/6207中修复,并作为DRF 3.9.2的一部分发布。更完整的上下文可以在https://github.com/encode/django-rest-framework/issues/6206中阅读。