Django中如何强制请求绕过已存在缓存键的缓存?
在Django中强制请求绕过已有缓存键的缓存方案
当然可以实现条件性绕过缓存的需求,核心思路是通过自定义中间件标记请求,让Django自带的缓存中间件跳过缓存读取和更新操作,同时控制响应头避免客户端缓存。
具体实现步骤
修改自定义中间件
在你的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调整中间件顺序
确保你的自定义中间件放在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
相关产品推荐
相关产品推荐

