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

如何在Django中使用FileBasedCache后端缓存404响应?

如何让Django的FileBasedCache缓存404响应

默认情况下,Django的缓存中间件只会缓存状态码为200的响应(部分重定向状态码如301/302也在默认缓存范围内,但404不在),而FileBasedCache本身只是负责缓存的存储实现——控制哪些响应被缓存的逻辑,核心在缓存中间件里。要实现缓存404,你可以通过以下两种方式处理:

方法一:自定义缓存中间件,扩展允许缓存的状态码

Django的UpdateCacheMiddleware是决定哪些响应会被写入缓存的核心组件,我们可以继承它并重写process_response方法,把404状态码加入允许缓存的范围:

  1. 在你的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
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:17:35