【问题标题】:How do I delete a cached template fragment in Django?如何在 Django 中删除缓存的模板片段?
【发布时间】:2012-06-02 11:40:47
【问题描述】:

以前,我在我的 Django 模板中设置了一个缓存的 HTML 块,如下所示。

{% load cache %}            
    {% cache 10000 courseTable %} <!-- Cached HTML --> {% endcache %}

现在,我已更新此缓存内容并想要刷新它。我尝试更改时间无济于事:

{% load cache %}            
    {% cache 0 courseTable %} <!-- Updated Cached HTML --> {% endcache %}

在这种情况下,页面仍然显示旧的缓存 HTML。

我还尝试删除与缓存相关的模板标签并重新插入它们。但是,在这种情况下,我重新插入缓存模板标签后,内容只是恢复为最初缓存的内容。

我能做什么?我不想等待大约 2 小时来重新加载我的缓存。

【问题讨论】:

  • 等等,我可以用 python-memcache 做到这一点吗?
  • 如何清空缓存?我可以完全清空 Memcache。
  • 计算机科学只有两个难题...

标签: django django-cache python-memcached


【解决方案1】:

对于 Django 1.6+ 和 Django Documentation,您可以生成您要查找的部分的密钥并将其删除:

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

# cache key for {% cache 500 sidebar username %} templatetag
key = make_template_fragment_key('sidebar', [username])
cache.delete(key) # invalidates cached template fragment

您只需要使用您之前定义的courseTable 参数调用make_template_fragment_key

【讨论】:

  • 您的代码示例的第 4 行无效,我想这应该是一个评论,但是它让我觉得我在看半伪代码,并且无法让它工作.我认为强调[username] 确实应该是一个列表很重要。也许这只是我:)
【解决方案2】:

如果您有能力完全清空 memcached,请运行 flush_all cmd 或直接运行

from django.core.cache import cache
cache.clear()

否则你必须generate the cache-key manuallytimeout 在密钥过期之前不会被刷新。

【讨论】:

    【解决方案3】:

    在 Django 1.6 之前,cache 模板标签或多或少地在标签定义的主体中构建了它的缓存键(参见 here)。从 1.6 开始,模板片段缓存键已使用 django.core.cache.utils.make_template_fragment_key 函数构建(请参阅 here)。

    在任何情况下,您都可以通过使用或定义make_template_fragment_key 来删除特定的缓存片段,以获取其缓存键,如下所示:

    from __future__ import unicode_literals
    
    import hashlib
    from django.core.cache import cache
    from django.utils.encoding import force_bytes
    from django.utils.http import urlquote
    
    TEMPLATE_FRAGMENT_KEY_TEMPLATE = 'template.cache.%s.%s'
    
    
    def make_template_fragment_key(fragment_name, vary_on=None):
        if vary_on is None:
            vary_on = ()
        key = ':'.join(urlquote(var) for var in vary_on)
        args = hashlib.md5(force_bytes(key))
        return TEMPLATE_FRAGMENT_KEY_TEMPLATE % (fragment_name, args.hexdigest())
    
    
    def delete_cached_fragment(fragment_name, *args):
        cache.delete(make_template_fragment_key(fragment_name, args or None))
    
    
    delete_cached_fragment('my_fragment', 'other', 'vary', 'args')
    

    此代码直接从 django 代码库复制而来,因此适用this 许可和版权。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2020-05-31
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多