11

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

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

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

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

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

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

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

4

3 回答 3

14

对于 Django 1.6+ 和Django 文档,您只需生成要查找的部分的密钥并将其删除:

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

您只需要make_template_fragment_key使用先前定义的courseTable参数进行调用。

于 2017-03-09T21:39:53.043 回答
8

如果您有能力完全清空 memcached,请运行flush_allcmd 或干脆

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

否则您必须手动生成缓存键。在timeout密钥过期之前不会刷新。

于 2012-05-28T04:47:16.630 回答
2

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

在任何情况下,您都可以通过使用或定义来删除特定的缓存片段,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 代码库复制,因此适用许可和版权。

于 2015-01-18T23:34:50.297 回答