将Django REST Framework与基于会话的CSRF结合使用

问题描述 投票:1回答:1

我在无法使用基于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令牌,从而导致所有PUTPATCH ,并且DELETE请求失败并返回403响应。

I believe

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

我在无法使用基于cookie的CSRF令牌的环境中使用Django + Django REST Framework;因此,我必须使用CSRF_USE_SESSIONS = True运行。但是,DRF Web UI取决于此...

django django-rest-framework csrf
1个回答
0
投票

此内容已在https://github.com/encode/django-rest-framework/pull/6207中修复,并作为DRF 3.9.2的一部分发布。更完整的上下文可以在https://github.com/encode/django-rest-framework/issues/6206中阅读。

© www.soinside.com 2019 - 2024. All rights reserved.