每次打开网页都在苦等?也许是时候给Django网站加个缓存魔法了!
什么是模板分片缓存?为什么需要它?
想象一下,你每次进入超市都要重新找购物车,而不是直接拿门口现成的,是不是很浪费时间?同样,网站每次接收到用户请求时,如果都要重新执行数据库查询、计算和模板渲染,自然会变得缓慢无比。
Django模板分片缓存的核心思想很简单:把页面中那些不经常变化但又耗费资源的"碎片"预先渲染好存起来,下次直接使用,避免重复劳动。
与整个页面缓存不同,分片缓存让我们能够精准控制缓存的范围,只缓存那些真正需要缓存的部分。比如:
- 网站导航栏(通常变化不频繁)
- 热门文章排行榜(可能每小时更新一次)
- 推荐商品列表(可能每天更新几次)
- 分类菜单(几乎不变化)
模板分片缓存 vs 其他缓存方式
Django提供了多种缓存机制,但它们各有适用场景:
- 整页缓存:适合纯静态页或登录前列表,命中率高但灵活性差
- 模板片段缓存:局部热点组件,灵活性和效率的平衡点
- 低层缓存:在视图或服务层按key缓存序列化结果,控制精度最高
在这三种方式中,模板片段缓存通常在简单性和效率之间取得了最佳平衡,它不需要像低层缓存那样手动管理缓存键,又比整页缓存更加灵活。
Django模板分片缓存基础用法
环境配置:选择缓存后端
在开始使用模板分片缓存之前,我们需要先配置缓存后端。Django支持多种缓存后端,包括内存缓存(如Memcached和Redis)、文件系统缓存和数据库缓存等。
这里以Redis为例,在settings.py中配置:
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"db": "0",
},
"KEY_PREFIX": "my_site", # 缓存前缀
"TIMEOUT": 60 * 60 * 12, # 缓存过期时间,单位为秒(12小时)
}
}
模板分片缓存的基本语法
在Django模板中使用分片缓存非常简单:
{% load cache %}
{# 缓存语法:cache [超时时间] [缓存键名] [可选的额外变量] #}
{% cache 500 sidebar %}
<div class="sidebar">
<h3>热门文章</h3>
<ul>
{% for article in hot_articles %}
<li>{
{ article.title }}</li>
{% endfor %}
</ul>
</div>
{% endcache %}
这个例子中:
500是缓存超时时间(500秒)sidebar是缓存片段的名称- 片段内容是一个包含热门文章列表的侧边栏
更精细的缓存控制
现实中的网站往往需要更精细的缓存控制。比如,对于已登录和未登录用户,我们可能需要显示不同的内容:
{% load cache %}
{% cache 500 sidebar request.user.username %}
<div class="sidebar">
<h3>个性化推荐</h3>
<p>你好,{
{ request.user.username }}!</p>
<!-- 更多个性化内容 -->
</div>
{% endcache %}
或者对于多语言网站,需要考虑语言差异:
{% load i18n %}
{% load cache %}
{% get_current_language as LANGUAGE_CODE %}
{% cache 600 welcome LANGUAGE_CODE %}
{% translate "Welcome to example.com" %}
{% endcache %}
关键点:缓存键的生成依赖于你提供的参数。只要参数有任何不同,就会创建不同的缓存副本。这既提供

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



