如何在接收信号时使django模板缓存密钥到期?

时间:2009-11-23 10:56:48

标签: django caching templates

在我的首页模板中,我使用缓存函数,如下所示:

{% cache 86400 my_posts %}
    {% get_latest_posts %}
{% endcache %}

当有新帖子时我想使缓存密钥失效;像这样:

def clear_post_cache():
    cache.delete('my_posts')

post_save.connect(clear_post_cache, sender=Post)

我的问题是缓存密钥无法作为'my_posts'访问。如何找到密钥名称?

3 个答案:

答案 0 :(得分:16)

查看缓存键的constructed

args = md5_constructor(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]))
cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest())

密钥是片段名称(my_posts)和缓存标记的其他参数的md5总和的组合。由于您没有其他参数,因此hexdigest为d41d8cd98f00b204e9800998ecf8427e(空字符串的md5哈希值)。因此缓存密钥应该最终为

template.cache.my_posts.d41d8cd98f00b204e9800998ecf8427e

如果您需要更通用的解决方案,this snippet可能有帮助。

答案 1 :(得分:3)

请注意,上述Benjamin Wohlwend第一行中的md5_constructor已被弃用。 Current(2011年11月)版本是:

args = hashlib.md5(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]))

答案 2 :(得分:3)

from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

cache.delete(make_template_fragment_key('footer'))