正在重置Django缓存模板加载程序的缓存

正在重置Django缓存模板加载程序的缓存,django,django-templates,memcached,Django,Django Templates,Memcached,Django 1.2引入了一个新的模板加载器,它将数据存储在缓存中(Django.template.loaders.cached.loader) 不幸的是,我没有找到任何关于缓存如何失效以及何时和如何重置的信息 我想在我的服务器上使用它,但我不确定它是否会在django重新启动时重置(这对我来说已经足够了)。通过深入django的源代码,您可以找到当前服务器实例的模板加载器存储在django.template.loader.template\u source\u loaders 当您使用缓存加载

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

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


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

通过深入django的源代码,您可以找到当前服务器实例的模板加载器存储在
django.template.loader.template\u source\u loaders

当您使用缓存加载程序时,只有一个加载程序。所以您可以获取它并调用它的reset函数来重置模板缓存

下面是一些代码片段,我还没有亲自测试过

from django.template.loader import template_source_loaders
loader = template_source_loaders[0]
loader.reset()
如果选中
django.template.loaders.cached
,则可以看到django只需使用一个变量
template\u cache
将模板名称保存到模板路径缓存中。它不使用memcached。因此,当django重新启动时,它应该被重置

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

好了:)

只有此解决方案才能保证工作,包括生产环境,而无需重新启动服务器,即使您使用的是
'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'%}
模板标记后,您可以确定其他答案是错误的(使用
loader.reset()
后不会重置
'some_template'
的缓存,其中
loader
只是通过相对导入导入导入的
模板源加载程序的迭代器


我使用此方法使存储在数据库中的模板(由库创建)无效,并通过
{%include%}将其包含到普通模板中
template tag.

由于模板加载器系统已被重构,此处编写的现有解决方案打破了Django 1.9。如果您尝试使用导入
模板源加载器的代码,但导入失败,请尝试以下操作:

from django.template.loader import engines

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

此代码假设您的
模板
设置使用默认的
'loaders'
选项,或者只使用一个
django.template.loaders.cached.Loader

哦,等等……我刚刚意识到-它不使用memcached,对吗?。因此在django重新启动后它会重置……对吗?Thanx,我自己刚刚发现了这一点。所以,重新启动django服务器就足够了=)只有当您有一个线程和一个进程时,它才适用于调试服务器。生产中有许多线程和过程。在那里不行。