【问题标题】:Resetting cache for Django cached template loader为 Django 缓存模板加载器重置缓存
【发布时间】:2011-05-03 13:00:35
【问题描述】:

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

很遗憾,我没有找到有关缓存如何失效以及何时以及如何重置的任何信息。

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

【问题讨论】:

  • 哦,等等...我刚刚意识到 - 它不使用 memcached,对吗?.. 所以它在 django 重新启动后重置...我说的对吗?

标签: django django-templates memcached


【解决方案1】:

这里编写的现有解决方案在 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

【讨论】:

    【解决方案2】:

    只有这个解决方案才能保证工作,包括生产环境,无需重启服务器,即使你使用'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只是通过相对导入导入的template_source_loaders的迭代器。

    我使用这种方法使数据库中存储的模板(由django-dbtemplates库创建)失效,并通过{% include %}模板标签包含在普通模板中。

    【讨论】:

      【解决方案3】:
      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()
      

      你去吧:)

      【讨论】:

        【解决方案4】:

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

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

        这里有一些sn-ps的代码,我自己没有测试过。

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

        如果你检查django.template.loaders.cached,你可以看到django只是使用一个变量template_cache来保存模板名到模板路径缓存。它不使用内存缓存。所以应该在django重启时重置。

        【讨论】:

        • 谢谢,我自己也发现了。所以,重启 django 服务器就足够了 =)
        • 只有一个线程和一个进程的调试服务器才有效。生产中有许多线程和进程。它不会在那里工作。
        猜你喜欢
        • 2016-08-28
        • 2014-09-18
        • 2014-02-06
        • 2017-10-25
        • 2015-05-25
        • 1970-01-01
        • 2014-03-10
        • 2014-01-06
        • 2011-12-27
        相关资源
        最近更新 更多