Django 1.2引入了一个新的模板加载器,它将数据存储在缓存中(django.template.loaders.cached.Loader
)。
不幸的是,我没有找到有关缓存如何失效以及何时以及如何重置的任何信息。
我想在我的服务器上使用它,但我不确定,它会在django restart上重置(这对我来说已经足够了)。
答案 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
。