直接用 django-redis 配 redis + {% cache %} 标签即可实现页面片段缓存,无需手写客户端;必须正确配置 caches"default" 为 "django_redis.cache.rediscache",并设置 options 中的 client_class 和 compressor,否则易出现 attributeerror 或内存浪费。

直接用 django-redis 配 Redis + 模板 {% cache %} 标签,就能实现页面片段缓存,不需要手写 Redis 客户端或序列化逻辑。
确认 django-redis 已正确安装并接入 Django 缓存框架
很多缓存失效或模板不生效的问题,根源是 CACHES 配置没进 Django 的缓存系统,而是自己另起一套 Redis 连接。
- 必须用
pip install django-redis,不是redis-py单独包 -
CACHES["default"]["BACKEND"]必须设为"django_redis.cache.RedisCache",不是"django.core.cache.backends.redis.RedisCache"(后者是 Django 4.2+ 原生支持,但缺失压缩、连接池等关键能力) -
LOCATION支持带密码的 URL 格式,比如"redis://:mypass@10.0.1.5:6379/2";若用 Unix socket,格式是"unix:///var/run/redis.sock?db=1" - 漏掉
"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"}可能导致cache.set()报AttributeError: 'Redis' object has no attribute 'setex'
在模板里用 {% cache %} 标签时,缓存键依赖哪些变量
模板缓存不是“把这段 HTML 存起来”那么简单,它的键由所有传入参数拼接生成,任意一个变化都会触发新缓存。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 基本形式:
{% cache 300 sidebar user.id request.path %}→ 键类似cache_sidebar_1_/products/ -
user.id是整数,request.path是字符串,Django 会原样转成字符串拼接,不会自动 JSON 序列化 - 如果传了
None或复杂对象(如datetime),会报TypeError: unhashable type,必须提前转成字符串或 ID - 不要在参数里放
request整体,它不可哈希;改用request.user.id、request.GET.get("q")等具体字段
缓存失效必须主动清理,Django 不会自动感知数据变更
模板片段缓存的键名由 Django 自动生成且不暴露,你不能靠猜去删。得用一致的命名约定 + 主动失效策略。
- 推荐在视图或信号中,用相同参数组合调用
cache.delete_pattern("cache_sidebar_*")(需启用django_redis.cache.RedisCache的 pattern 支持) - 更稳妥的做法:给缓存加可预测前缀,比如
{% cache 300 "product_sidebar" product.id %},然后失效时删cache_product_sidebar_123 - 如果用了
KEY_PREFIX(如"myapp"),实际键是"myapp:cache_sidebar_1_/home/",清理时要带上前缀 - 忘记清理会导致用户看到过期侧边栏、错误价格、已下架商品 —— 这类问题线上很难复现,但影响明确
注意 {% cache %} 和视图层 cache_page 的作用域冲突
两者都走同一个缓存后端,但粒度和生命周期不同,混用容易互相覆盖或失效错乱。
-
@cache_page(60)缓存整个 HTTP 响应(含状态码、头信息),绕过视图逻辑,{% cache %}在渲染阶段才介入 - 如果对同一页面既用了
@cache_page又用了{% cache %},后者可能根本没机会执行 —— 因为响应直接从缓存返回了 - 典型误用:在
@cache_page视图里还塞{% cache %},结果发现片段缓存从不更新,其实是页面级缓存挡在前面 - 分层缓存建议:页面级缓存只用于完全静态页(如帮助文档),动态页一律用片段缓存 + 视图内编程式缓存(
cache.get/set)
最易被忽略的一点:模板缓存默认不压缩,大段 HTML 存 Redis 会显著增加网络传输和内存占用;务必在 OPTIONS 里加上 "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",否则 10KB 的 HTML 可能占 3 倍空间。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










