2010-11-18 79 views
3

我想在不重新启动应用程序的情况下在django应用程序中切换Jinja2模板。如何强制Jinja2模板重新编译?

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

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

myskin_utils.py:

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

我也尝试重新加载一个包含我的

reload(myskin) #also no effect on the output 

另一件事我想改变的飞行是语言ENV_OBJECT模块,但我想这是一个单独的问题。

感谢您的任何建议。我没有使用jinja2设置缓存,但是我看到从Django模板切换后使用Jinja的速度提高了,我怀疑模板字节码存在于我的视图函数的编译代码中,但是我没有研究过忍者的细节。

我有ENV(的CoffinEnvironment一个实例,其子类神社的Environment)在视图模块的全局命名空间的进口,并呼吁ENV.get_template()内视图功能(Django的+棺材+ Jinja2的)。

发现,如果我叫Python的reload()内建我的环境模块上内视图功能模板做开关,但我不希望坚持的代码到每一个功能。

回答

4

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

其中之一是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()并清除所有模板。
+0

谢谢!我没有为Jinja2设置缓存。如果我这样做,你认为我会在我的环境中加快速度吗?我的理解是,我的模板字节码已经在内存中,对不对?再次感谢! – Evgeny 2010-11-18 17:08:30

+6

我认为这个答案是错误的 - 根据[this](http://jinja.pocoo.org/docs/api/#bytecode-cache),字节码缓存仅用于第一次运行,而不是每个请求。至于自动重新加载更改模板,有'auto_reload'选项[这里](http://jinja.pocoo.org/docs/api/#jinja2.Environment)。不知道在2010年11月如果是相同的,这就是为什么我不低调这个答案。 – 2012-01-18 23:23:12

0

这是错误的。 Jinja默认在cache_size(环境参数)中使用内存缓存中的LRUCache。您可以使用磁盘高速缓存来重新启动应用程序的预格式化(不需要重新编译)。