Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 使特定缓存无效_Django_Django Cache - Fatal编程技术网

Django 使特定缓存无效

Django 使特定缓存无效,django,django-cache,Django,Django Cache,我在基本模板中有缓存标记: {% cache 100000 categories %} Categories output {% endcache %} 当我通过Django admin添加新类别时,我希望使此缓存无效: class CategoriesAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): super(CategoriesAdmin, self).sa

我在基本模板中有缓存标记:

{% cache 100000 categories %}
    Categories output
{% endcache %}
当我通过Django admin添加新类别时,我希望使此缓存无效:

class CategoriesAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        super(CategoriesAdmin, self).save_model(request, obj, form, change)

        cache.delete('categories')

但是缓存仍然有效!怎么了?

这是因为实际的键不是“categories”,而是Django使用以下内容动态构造的键:

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())
见:

通常,密钥的格式为:
template.cache.categories.[hexdigest]
。因此,棘手的部分是找出答案

我(在评论中)发现了以下内容,看起来它应该仍然有效(从2009年开始):


由于没有将任何变量传递给templatetag,因此只需使用:
invalidate\u template\u cache('categories')
即可调用它。否则,您需要将模板标记变化的所有变量的列表作为第二个参数传入。

在Django 1.6+中,请使用
make\u template\u fragment\u key

django.core.cache.utils.make\u template\u fragment\u key(fragment\u name,vary\u on=None)
如果要获取用于缓存片段的缓存密钥,可以使用make\u template\u fragment\u key。片段名称与缓存模板标记的第二个参数相同;vary_on是传递给标记的所有附加参数的列表。此函数可用于使缓存项无效或覆盖缓存项,例如:

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

像魔法一样工作:-)

谢谢,很好用!为什么它仍然不在本机Django函数中!在Django 1.4.X中,没有使用md5_构造函数,您必须使用hashlib。args=hashlib.md5(u':'.join([urlquote(resolve_variable(var,context))用于self.vary_on中的var]))
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key
# cache key for {% cache 500 sidebar username %}
key = make_template_fragment_key('sidebar', [username])
cache.delete(key) # invalidates cached template fragment