如何在 Django 中显式重置模板片段缓存?
Posted
技术标签:
【中文标题】如何在 Django 中显式重置模板片段缓存?【英文标题】:How can explicitly reset a template fragment cache in Django? 【发布时间】:2011-12-27 07:26:52 【问题描述】:我正在为我的 Django 应用程序使用 Memcache。
在 Django 中,开发人员可以使用模板片段缓存来仅缓存模板的一部分。 https://docs.djangoproject.com/en/dev/topics/cache/#template-fragment-caching
我想知道是否有一种方法可以显式更改模板片段缓存部分的值,例如在views.py 中。例如,除了模板片段缓存之外,是否可以使用类似于 cache.set("sidebar", "new value") 的方法?
感谢您的帮助。
【问题讨论】:
【参考方案1】:理论上,是的。您首先必须按照 Django 使用的相同模式创建一个模板缓存键,这可以通过 this snippet of code 完成:
from django.utils.hashcompat import md5_constructor
from django.utils.http import urlquote
def template_cache_key(fragment_name, *vary_on):
"""Builds a cache key for a template fragment.
This is shamelessly stolen from Django core.
"""
base_cache_key = "template.cache.%s" % fragment_name
args = md5_constructor(u":".join([urlquote(var) for var in vary_on]))
return "%s.%s" % (base_cache_key, args.hexdigest())
然后您可以执行cache.set(template_cache_key(sidebar), 'new content')
之类的操作来更改它。
但是,在视图中这样做有点难看。设置post-save signals 并在模型更改时使缓存条目过期更有意义。
上面的代码 sn-p 适用于 Django 1.2 及以下版本。我不确定 Django 1.3+ 的兼容性; django/templatetags/cache.py
会有最新消息。
对于 Django 1.7,django/core/cache/utils.py 有一个可用的功能。
【讨论】:
@SimonSteinberger:是的,你必须稍微修改一下;从此处复制或使用该功能:github.com/django/django/blob/master/django/core/cache/utils.py 刚刚发现,有一个记录在案的函数:docs.djangoproject.com/en/dev/topics/cache/…以上是关于如何在 Django 中显式重置模板片段缓存?的主要内容,如果未能解决你的问题,请参考以下文章