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时自定义统一的键前缀,简化缓存键生成逻辑:
- 给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
- 清理缓存时指定相同前缀,使用
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
相关产品推荐
相关产品推荐

