如何强制Jinja2模板重新编译?

时间:2010-11-18 05:10:58

标签: python jinja2

我正在尝试在django应用中切换Jinja2模板,而无需重新启动应用程序。

有人这样做过吗?基本上,我需要在应用皮肤选择更改后强制jinja2重新加载模板。

我试图在模板环境对象上重新创建缓存对象而没有任何效果。

myskin_utils.py:

from jinja2.environment import create_cache
ENV_OBJECT.cache = create_cache(50)

我还尝试用

重新加载包含ENV_OBJECT的模块
reload(myskin) #also no effect on the output

我想要动态改变的另一件事是语言,但我想这是一个单独的问题。

感谢您的任何建议。

编辑我没有使用jinja2设置缓存,但我确实看到从Django模板切换后使用Jinja加速,我怀疑模板字节码存在于编译后的代码中我的观点功能,但我没有查看jinja的细节。

我在视图模块的全局命名空间中导入了ENV(一个CoffinEnvironment的子实例,它将Jinja的Environment子类化),并在视图函数内调用ENV.get_template()(Django + Coffin + Jinja2) 。

发现如果我在我的环境模块中调用python的reload()内置视图函数,模板会切换,但我不想将该代码粘贴到每个函数中。

2 个答案:

答案 0 :(得分:4)

默认情况下,Jinja2根本不使用任何缓存,但建议配置缓存后端以加快速度。这样jinja2就不必在每个请求上解析和编译每个模板。 Jinja2目前支持2种不同的缓存类型:

其中一个是FileSystemBytecodeCache,它(就像名字所示)基于文件。因此,所有编译的模板都存储在文件系统中并从那里检索。如果仔细查看实现,您还会在其中找到cache.clear()方法,只删除此临时文件夹中的所有文件。导致所有模板再次被解析/编译。

另一种缓存类型是一个名为MemcachedBytecodeCache的缓存,它只是Memcache的一个瘦包装器。建议使用此方法,因为Memcache将所有内容存储在内存中,因此它比命中磁盘快一点,并且您可以使用来自不同主机的相同缓存(如果您运行某种类型的集群,这很有用)。

底层的Memcache客户端(werkzeug.contrib.cache,python-memcached或cmemcache)也提供了clear()方法,它将删除缓存中的所有内容。但是因为您可能也将缓存用于其他事情(例如,存储昂贵的数据库查询的结果),clear()方法不会在jinja中公开,因为它会影响所有内容(而不仅仅是模板)。

因此,总结一下您的选择是:

  • 使用没有缓存的Jinja2
  • 将Jinja2与FileSystemBytecodeCache一起使用,然后致电cache.clear()
  • 将Jinja2与MemcachedBytecodeCache一起使用并调用memcache_client.clear()(这也将清除缓存中的其他所有内容)。
  • 在另一个仅与Jinja2一起使用的端口上运行单独的memcached进程。然后拨打memcache_client.clear(),清除所有模板。

答案 1 :(得分:0)

这是错误的。 Jinja默认使用内存缓存中的LRUCache,即cache_size(Environment参数)。您可以使用磁盘缓存来重新启动app preformant(无需重新编译)。