如何在 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 中显式重置模板片段缓存?的主要内容,如果未能解决你的问题,请参考以下文章

id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?

如何在 CoffeeScript 中显式返回对象

在案例查询中显式转换枚举

如何在opencv中显式访问mjpeg后端进行视频捕获

如何在 lapply (R) 中显式定义附加参数

如何在Python中显式释放内存?