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

Django中如何强制请求绕过已存在缓存键的缓存?

在Django中强制请求绕过已有缓存键的缓存方案

当然可以实现条件性绕过缓存的需求,核心思路是通过自定义中间件标记请求,让Django自带的缓存中间件跳过缓存读取和更新操作,同时控制响应头避免客户端缓存。

具体实现步骤

  1. 修改自定义中间件
    在你的middleware.py中,根据判断逻辑(比如请求头特定值、示例中的global_value)给请求对象添加标记,让缓存中间件失效:

    def middleware(request):
        # 替换为你实际的判断规则,比如从request.headers.get('X-Your-Header')取值判断
        if global_value % 2 == 1:
            # 标记跳过缓存读取
            request._cache_fetch_from_cache = False
            # 标记跳过缓存更新
            request._cache_update_cache = False
        
        response = get_response(request)
        
        # 给需要绕过缓存的响应添加强制不缓存头,避免客户端本地缓存
        if global_value % 2 == 1:
            response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
            response['Pragma'] = 'no-cache'
            response['Expires'] = '0'
        
        return response
    
  2. 调整中间件顺序
    确保你的自定义中间件放在FetchFromCacheMiddleware之前,这样请求在到达缓存读取中间件前就已经被标记。修改settings.py的中间件配置:

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 你的自定义中间件位置要在这里
        'your_app.middleware.middleware',
        # 其他原有中间件...
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
    

原理说明

Django的FetchFromCacheMiddleware内部会检查request._cache_fetch_from_cache属性,如果值为False,就会跳过从缓存读取响应的逻辑;UpdateCacheMiddleware则会检查request._cache_update_cache,同样为False时跳过缓存更新操作。额外添加响应头是为了确保客户端浏览器也不会缓存该请求的结果,避免后续请求误读本地缓存。

内容的提问来源于stack exchange,提问作者Tony.Luo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:07:40