将 Django REST Framework 与 sessions-based CSRF 一起使用

Using Django REST Framework with sessions-based CSRF

我在无法使用 cookie-based CSRF 令牌的环境中使用 Django + Django REST Framework;因此我必须 运行 和 CSRF_USE_SESSIONS = True.

然而,DRF 网络 UI 依赖此 cookie 进行所有交互。看起来这是通过读取 csrftoken cookie 并在后续请求中设置 X-CSRFToken header 来设置的,如果隐藏字段不包含在中,则由 django.middleware.csrf.CsrfViewMiddleware.process_view() 使用请求 body。这是在 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 表单确实包含表单 body 中的 CSRF 令牌,因此没有 cookie 意味着 Web 界面根本无法访问 CSRF 令牌,导致所有 PUTPATCHDELETE 请求失败并返回 403 响应。

相信这是 DRF 中的错误,但这可能是预期的行为。有人可以解释一下 DRF 是如何与 CSRF_USE_SESSIONS = True 一起使用的吗?

这已在 https://github.com/encode/django-rest-framework/pull/6207 and released as part of DRF 3.9.2. More complete context can be read at https://github.com/encode/django-rest-framework/issues/6206 中修复。