重置Django缓存模板加载器的缓存

时间:2010-11-01 17:07:18

标签: django django-templates memcached

Django 1.2引入了一个新的模板加载器,它将数据存储在缓存中(django.template.loaders.cached.Loader)。

不幸的是,我没有找到有关缓存如何失效以及何时以及如何重置的任何信息。

我想在我的服务器上使用它,但我不确定,它会在django restart上重置(这对我来说已经足够了)。

4 个答案:

答案 0 :(得分:4)

通过深入了解django的源代码,您可以发现当前服务器实例的模板加载器存储在django.template.loader.template_source_loaders

当你使用缓存加载器时,那里只有一个加载器。所以你可以得到它并调用它的重置函数来重置模板缓存。

以下是一些代码片段,我自己没有测试过。

from django.template.loader import template_source_loaders
loader = template_source_loaders[0]
loader.reset()

如果选中django.template.loaders.cached,则可以看到django只使用一个变量template_cache将模板名称保存到模板路径缓存中。它不使用memcached。所以当django重启时应该重置。

答案 1 :(得分:4)

from django.template.loader import template_source_loaders

def reset_template_cache():
    if not template_source_loaders:
        return

    for loader in template_source_loaders:
        loader.reset()

你去:)

答案 2 :(得分:1)

只有这个解决方案才能得到保证,包括生产环境,无需重启服务器,即使您使用的是'django.template.loaders.cached.Loader'后端:

import django.template.loader

def reset_template_cache():
    if django.template.loader.template_source_loaders:
        for t in django.template.loader.template_source_loaders:
            t.reset()

这是显式绝对导入,可用于修补全局变量。使用{% include 'some_template' %}模板标记后,您可以确定其他答案是错误的('some_template'的缓存在使用loader.reset()之后不能重置loader只是{{1}的迭代器通过相对导入导入。

我使用此方法使存储在数据库中的模板(由django-dbtemplates库创建)失效,并通过template_source_loaders模板标记包含在普通模板中。

答案 3 :(得分:0)

由于重构了模板加载器系统,此处编写的现有解决方案在Django 1.9左右失效。如果您尝试使用导入template_source_loaders的代码而导入失败,请尝试以下操作:

from django.template.loader import engines

for engine in engines.all():
    engine.engine.template_loaders[0].reset()

此代码假定您的TEMPLATES设置使用默认的'loaders'选项,或仅使用单个django.template.loaders.cached.Loader