You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:26