Django REST API自定义CSRF中间件异常:所有请求csrf_exempt为True
问题原因及修复方案
核心问题
你的自定义CustomCsrfMiddleware重写了process_request方法,但未调用父类CsrfViewMiddleware的同名方法,导致父类负责初始化的CSRF处理状态缺失,最终触发父类process_view的默认豁免逻辑,让所有请求的csrf_exempt被设为True。
父类process_request会完成以下关键初始化:
- 设置
request.csrf_processing_done标记,标识CSRF检查流程已启动 - 处理CSRF Cookie的基础初始化逻辑
- 为后续
process_view的豁免判断提供必要的状态依据
修复步骤
1. 修复process_request方法
在自定义逻辑前先调用父类的process_request,确保基础状态初始化完成:
def process_request(self, request): # 先执行父类的初始化逻辑 super().process_request(request) try: csrf_secret = self._get_secret(request) if csrf_secret is None: raise InvalidTokenFormat(REASON_CSRF_TOKEN_MISSING) except InvalidTokenFormat: _add_new_csrf_cookie(request) else: if csrf_secret is not None: request.META["CSRF_COOKIE"] = csrf_secret
2. 修正路径豁免逻辑(可选)
如果你需要豁免/hook路径,不要依赖父类的自动判断,直接在process_view中显式处理:
def process_view(self, request, callback, callback_args, callback_kwargs): # 豁免指定路径的CSRF检查 if request.path.startswith('/hook'): callback.csrf_exempt = True return super().process_view(request, callback, callback_args, callback_kwargs)
3. 额外验证
- 确保在
settings.MIDDLEWARE中用CustomCsrfMiddleware替换原有的django.middleware.csrf.CsrfViewMiddleware - 检查
_get_hmac、_add_new_csrf_cookie等自定义函数的逻辑,确保它们正确生成和处理CSRF密钥与Cookie,避免因异常导致父类逻辑误判
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

