django - 在基于 session 的 CSRF 中使用 Django REST 框架

标签 django django-rest-framework csrf

我在无法使用基于 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/

相关文章:

angularjs - Spring CSRF + AngularJs

python - 在django中创建原子事务是否会自动创建锁

python - Django 模型 ImageField 中的默认图像不起作用

python - 字段名称 user_username 对于模型配置文件无效

django rest框架列表更新api View

java - CsrfGuard 出现问题。尽管从官方网站进行了配置,csrf 仍抛出问题

javascript - 如何使用 Javascript 在 Django 中制作股票图表?

python - Django StreamingHttpResponse 没有设置正确的文件名

django - 如何在 django rest 框架中存储外键字段?

security - 在单个页面上为多个表单生成 CSRF token