如果你是 Django 开发者,可能对 django.core.cache(服务器端缓存)很熟悉。但是 Django 提供了另一个强大的工具集 django.utils.cache,用于有效控制 HTTP 缓存。这个模块专注于管理对服务器负荷和用户体验至关重要的 HTTP 头部。

在这篇文章中,我们将探讨 django.utils.cache 的主要功能和用法。


django.core.cachedjango.utils.cache 的区别



首先需要明确的是这两者的不同之处。

  • django.core.cache(服务器端缓存):

    • 将数据库查询结果、复杂运算结果、部分模板等存储在 服务器内存(RAM)、Redis、Memcached 等。
    • 目的:减少服务器内部的运算负担,提高响应生成速度。
  • django.utils.cache(HTTP 缓存 / 客户端缓存):

    • 设置 HTTP 响应头,如 Cache-Control, Vary, ETag, Last-Modified
    • 目的:指示浏览器或代理服务器缓存响应,当相同请求发生时,使用缓存的响应,而不需要再次请求服务器。

简而言之,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

用于设置 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-ControlVary 头的设置是 显著减少服务器流量 的关键策略,使用户体验到 更快的加载速度。特别是在静态内容或不常变动的列表页面中,利用该模块的装饰器可以期待显著的性能提升。