如何在Django中使用FileBasedCache后端缓存404响应?
如何让Django的FileBasedCache缓存404响应
默认情况下,Django的缓存中间件只会缓存状态码为200的响应(部分重定向状态码如301/302也在默认缓存范围内,但404不在),而FileBasedCache本身只是负责缓存的存储实现——控制哪些响应被缓存的逻辑,核心在缓存中间件里。要实现缓存404,你可以通过以下两种方式处理:
方法一:自定义缓存中间件,扩展允许缓存的状态码
Django的UpdateCacheMiddleware是决定哪些响应会被写入缓存的核心组件,我们可以继承它并重写process_response方法,把404状态码加入允许缓存的范围:
- 在你的Django项目中创建一个中间件文件,比如
middleware/custom_cache.py,写入以下代码:
from django.middleware.cache import UpdateCacheMiddleware class CustomUpdateCacheMiddleware(UpdateCacheMiddleware): def process_response(self, request, response): # 允许缓存200和404状态码的响应 if response.status_code in (200, 404): return super().process_response(request, response) return response
- 在
settings.py中替换默认的缓存中间件:- 把原有的
'django.middleware.cache.UpdateCacheMiddleware'替换成你自定义的中间件路径,比如'yourapp.middleware.custom_cache.CustomUpdateCacheMiddleware' - 注意中间件顺序:
UpdateCacheMiddleware必须放在所有其他中间件的最前面,FetchFromCacheMiddleware则要放在最后面。
- 把原有的
方法二:通过视图装饰器指定缓存404
如果只需要在特定视图中缓存404响应,可以用cache_page装饰器,通过status_codes参数指定要缓存的状态码:
from django.views.decorators.cache import cache_page from django.http import Http404 @cache_page(60 * 15, status_codes=(200, 404)) # 缓存15分钟,包含200和404响应 def my_view(request): # 视图逻辑示例:满足条件时返回404 if not some_valid_condition: raise Http404("Requested page not found") return HttpResponse("Normal content")
注意事项
- 无论用哪种方法,都要确保
FileBasedCache的配置正确(比如LOCATION指定的路径存在且有读写权限)——后端仅负责存储,不影响哪些响应被缓存的判断。 - 缓存404时要注意:如果你的404页面是动态生成的(比如不同URL返回不同内容),要确保缓存键能正确区分这些响应。Django默认的缓存键会包含请求路径,一般能满足需求,但如果有额外变量影响404内容,可能需要自定义缓存键。
- 测试验证:可以查看
FileBasedCache的存储目录(即settings.CACHES['default']['LOCATION']),访问返回404的页面后,检查是否生成了对应的缓存文件。
内容的提问来源于stack exchange,提问作者user2080105
相关产品推荐
相关产品推荐

