如果你是 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 缓存 / 客户端缓存):- 设置 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: 表示响应只能存储在用户浏览器这样的私有(private)缓存中。(通常与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') 当根据移动和桌面 User-Agent 提供不同 HTML 时,会使缓存区分这两者进行存储。
@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 头的设置是 显著减少服务器流量 的关键策略,使用户体验到 更快的加载速度。特别是在静态内容或不常变动的列表页面中,利用该模块的装饰器可以期待显著的性能提升。
目前没有评论。