You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django cache_page缓存键规则是什么?如何获取Wagtail API对应缓存键

Django cache_page 缓存键生成规则与Wagtail API单页缓存清理方案

一、Django cache_page 默认缓存键生成规则

cache_page 装饰器生成缓存键的逻辑由 django.utils.cache.generate_cache_key 实现,默认规则如下:

  • 基础键结构:views.decorators.cache.cache_page.<键前缀>.<请求路径+查询参数的MD5值>.<Accept-Encoding请求头的MD5值>
  • 未自定义key_prefix参数时,前缀默认是空字符串
  • 同一个接口如果有gzip、非压缩等不同返回格式,会生成不同的缓存键

二、单页缓存清理实现

你可以直接调用Django原生的缓存键生成工具,构造对应接口的请求对象来生成准确的缓存键,代码实现如下:

from django.core.cache import cache
from django.http import HttpRequest
from django.utils.cache import get_cache_key
from wagtail.core.signals import page_published

def clear_page_api_cache(sender, **kwargs):
    page = kwargs["instance"]
    # 构造和API请求一致的请求对象
    request = HttpRequest()
    # 填写你的Wagtail API详情页路径
    request.path = f"/api/v2/pages/{page.id}/"
    # 按需添加你的接口会用到的请求头,比如编码、语言等
    request.META["HTTP_ACCEPT_ENCODING"] = "gzip, deflate, br"
    # 生成缓存键
    cache_key = get_cache_key(request)
    if cache_key:
        cache.delete(cache_key)
    # 如果还要清理列表页中包含该页面的缓存,可以自己扩展对应路径的键生成逻辑

page_published.connect(clear_page_api_cache)

三、优化方案(可选)

如果你不想处理请求头适配的问题,可以在使用cache_page时自定义统一的键前缀,简化缓存键生成逻辑:

  1. 给cache_page添加key_prefix参数:
@method_decorator(cache_page(600, key_prefix="wagtail_api_pages"), name="detail_view")
@method_decorator(cache_page(600, key_prefix="wagtail_api_list"), name="listing_view")
class CashedPagesAPIViewSet(PagesAPIViewSet):
    """Custom API endpoint that can receive a slug."""
    pass
  1. 清理缓存时指定相同前缀,使用delete_pattern方法批量删除(需要你的缓存后端支持模式匹配,比如Redis):
def clear_page_api_cache(sender, **kwargs):
    page = kwargs["instance"]
    # 删除对应详情页的所有编码版本缓存
    cache.delete_pattern(f"views.decorators.cache.cache_page.wagtail_api_pages.*{page.id}*")

内容的提问来源于stack exchange,提问作者hammygoonan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 04:57:02