我在无法使用基于 cookie 的 CSRF token 的环境中使用 Django + Django REST Framework;因此我必须使用 CSRF_USE_SESSIONS = True
运行.
但是,DRF Web UI 依赖此 cookie 进行所有交互。看来这是通过阅读 csrftoken
设置的cookie 和设置 X-CSRFToken
后续请求的 header ,然后由 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>
不使用的 DRF 表格
POST
确实在表单正文中包含 CSRF token ,因此没有 cookie 意味着 Web 界面根本无法访问 CSRF token ,导致所有 PUT
, PATCH
, 和 DELETE
请求失败并返回 403 响应。我相信这是 DRF 中的一个错误,但这可能是预期的行为。有人能解释一下 DRF 是如何与
CSRF_USE_SESSIONS = True
一起使用的吗? ?
最佳答案
这已在 https://github.com/encode/django-rest-framework/pull/6207 中修复并作为 DRF 3.9.2 的一部分发布。更完整的上下文可以阅读 https://github.com/encode/django-rest-framework/issues/6206 .
关于django - 在基于 session 的 CSRF 中使用 Django REST 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461537/