我正在尝试在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()
内置视图函数,模板会切换,但我不想将该代码粘贴到每个函数中。
答案 0 :(得分:4)
默认情况下,Jinja2根本不使用任何缓存,但建议配置缓存后端以加快速度。这样jinja2就不必在每个请求上解析和编译每个模板。 Jinja2目前支持2种不同的缓存类型:
其中一个是FileSystemBytecodeCache
,它(就像名字所示)基于文件。因此,所有编译的模板都存储在文件系统中并从那里检索。如果仔细查看实现,您还会在其中找到cache.clear()
方法,只删除此临时文件夹中的所有文件。导致所有模板再次被解析/编译。
另一种缓存类型是一个名为MemcachedBytecodeCache
的缓存,它只是Memcache的一个瘦包装器。建议使用此方法,因为Memcache将所有内容存储在内存中,因此它比命中磁盘快一点,并且您可以使用来自不同主机的相同缓存(如果您运行某种类型的集群,这很有用)。
底层的Memcache客户端(werkzeug.contrib.cache,python-memcached或cmemcache)也提供了clear()
方法,它将删除缓存中的所有内容。但是因为您可能也将缓存用于其他事情(例如,存储昂贵的数据库查询的结果),clear()
方法不会在jinja中公开,因为它会影响所有内容(而不仅仅是模板)。
因此,总结一下您的选择是:
FileSystemBytecodeCache
一起使用,然后致电cache.clear()
MemcachedBytecodeCache
一起使用并调用memcache_client.clear()
(这也将清除缓存中的其他所有内容)。memcache_client.clear()
,清除所有模板。答案 1 :(得分:0)
这是错误的。 Jinja默认使用内存缓存中的LRUCache,即cache_size(Environment参数)。您可以使用磁盘缓存来重新启动app preformant(无需重新编译)。