如果你是 Django 开发者,应该对 django.core.cache(服务器端缓存)非常熟悉。然而,Django 还提供了一个强大的工具集 django.utils.cache,它能够有效地控制 HTTP 缓存。这个模块专注于管理关键信息的 HTTP 头部,从而减少服务器负载并提升用户体验。
在这篇文章中,我们将探讨 django.utils.cache 的主要功能和用法。
django.core.cache 与 django.utils.cache 的区别
首先需要澄清的部分。
-
django.core.cache(服务器端缓存):- 将数据库查询结果、复杂运算的结果、部分模板等存储于 服务器内存(RAM)、Redis、Memcached 等。
- 目的:减少服务器内部计算的负担,提高响应生成速度。
-
django.utils.cache(HTTP 缓存 / 客户端缓存):- 设置诸如
Cache-Control,Vary,ETag,Last-Modified等 HTTP 响应头。 - 目的:指示浏览器或代理服务器缓存响应,以便在相同请求发生时使用缓存的响应,而不是重新向服务器请求。
- 设置诸如
简而言之,core.cache 主要是缓存 数据,而 utils.cache 控制缓存 HTTP 响应 的方式。
主要装饰器及功能
django.utils.cache 模块主要以装饰器的形式应用于视图(View)。
1. @cache_control
这是最基本同时也是最强大的装饰器,能够细致地控制 Cache-Control HTTP 头。
max_age: 缓存的有效时间(以秒为单位)。浏览器将在此时间段内使用缓存版本。public=True: 表示响应可以被公开(public)缓存(例如:CDN、代理)存储。private=True: 表示响应仅应存储在用户的浏览器等私人缓存中。 (通常与max_age一起使用)no_cache: 要求在使用缓存之前始终验证服务器的有效性。no_store: 绝对不允许缓存响应。
示例:
# views.py
from django.utils.cache import cache_control
# 将此视图的响应在浏览器缓存中存储1小时(3600秒)
@cache_control(max_age=3600)
def my_public_view(request):
# ...
return response
# 由于此视图包含敏感用户信息,因此只在私人缓存(浏览器)中存储30分钟
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
# ...
return response
2. @never_cache
顾名思义,这个装饰器设置该视图的响应绝对不被缓存。
它会添加 Cache-Control: max-age=0, no-cache, no-store, must-revalidate 头,以强烈指示浏览器不缓存响应。
示例:(主要用于支付页面、重要表单提交页面等)
# views.py
from django.utils.cache import never_cache
@never_cache
def sensitive_form_view(request):
# ...
return response
3. @vary_on_headers / @vary_on_cookie
用于设置 Vary 头。Vary 头在告知缓存的响应可能在什么条件下发生变化方面起着重要作用。
例如,使用 @vary_on_headers('User-Agent') 时,当提供不同的 HTML 时,缓存将根据移动设备和桌面设备的 User-Agent 进行区分存储。
@vary_on_cookie 用于视图内容因 cookie 值不同而发生变化时的情况。(例如:根据会话 cookie 的登录/登出状态的不同)
示例:
# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie
# 根据 User-Agent(移动/桌面)和 Accept-Language(语言设置)
# 分别存储缓存
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
# ...
return response
# 根据 cookie(会话)内容不同而改变的视图
@vary_on_cookie
def user_specific_view(request):
# ...
return response
总结
django.utils.cache 是 Django 中一个核心模块,能够很好地遵循 HTTP 标准并精细处理客户端的缓存。
适当设置 Cache-Control 和 Vary 头是 显著减少服务器流量、让用户获得 更快加载速度 的关键策略。特别是在静态内容或不常更改的列表页面中使用这个模块的装饰器,可以期待获得显著的性能提升。
目前沒有評論。