4

我正在尝试在 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 的速度有所提高,我怀疑模板字节码存在于我的视图函数的编译代码中,但我没有研究细节神社。

我在视图模块的全局命名空间中导入了ENV( CoffinEnvironmentJinja 的子类的一个实例)并调用内部视图函数(Django+Coffin+Jinja2)。EnvironmentENV.get_template()

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

4

2 回答 2

4

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

其中之一FileSystemBytecodeCache是(顾名思义)基于文件的。所以所有编译的模板都存储在文件系统中并从那里检索。如果您仔细查看实现,您还会发现cache.clear()其中有一个方法可以简单地删除此临时文件夹中的所有文件。导致所有模板再次被解析/编译。

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

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

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

  • 在没有缓存的情况下使用 Jinja2
  • 将 Jinja2 与 aFileSystemBytecodeCache和调用一起使用cache.clear()
  • 将 Jinja2 与MemcachedBytecodeCacheand 调用一起使用memcache_client.clear()(这也将清除缓存中的所有其他内容)。
  • 在另一个仅用于 Jinja2 的端口上运行单独的 memcached 进程。然后调用memcache_client.clear(),所有模板将被清除。
于 2010-11-18T12:01:20.023 回答
1

这是错误的。Jinja 默认在内存缓存中使用 LRUCache,缓存大小(环境参数)。您也可以使用磁盘缓存来对应用程序进行后续重启(无需重新编译)。

于 2018-03-07T12:16:02.880 回答