首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中删除缓存的模板片段?

如何在Django中删除缓存的模板片段?
EN

Stack Overflow用户
提问于 2012-05-28 11:19:16
回答 3查看 10K关注 0票数 11

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

代码语言:javascript
复制
{% load cache %}            
    {% cache 10000 courseTable %} <!-- Cached HTML --> {% endcache %}

现在,我已经更新了这个缓存内容,并想刷新它。我试着改变时间,但没有用:

代码语言:javascript
复制
{% load cache %}            
    {% cache 0 courseTable %} <!-- Updated Cached HTML --> {% endcache %}

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

我还尝试删除与缓存相关的模板标记,然后重新插入它们。但是,在本例中,在我重新插入缓存模板标记后,内容只是恢复为最初缓存的内容。

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

EN

回答 3

Stack Overflow用户

发布于 2017-03-10 05:39:53

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

代码语言:javascript
复制
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

票数 13
EN

Stack Overflow用户

发布于 2012-05-28 12:47:17

如果可以完全清空memcached,可以运行flush_all cmd或简单地

代码语言:javascript
复制
from django.core.cache import cache
cache.clear()

否则你必须使用generate the cache-key manually。在密钥过期之前,不会刷新timeout

票数 7
EN

Stack Overflow用户

发布于 2015-01-19 07:34:50

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

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

代码语言:javascript
复制
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许可证和版权。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10778988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档