我将 Jinja2 模板与 Bottle.py 和 Google App Engine 的 dev_appserver 一起用于开发。我希望模板在每个请求时自动重新加载(或者理想情况下仅在它们更改时),这样我就不必不断重新启动服务器。
根据瓶子的文档,您应该能够通过调用来禁用模板缓存bottle.debug(True)
。
不过,Jinja 似乎仍在缓存其模板。我相信这是因为瓶子 jinja2 适配器的编写方式(它只使用默认的 Jinja2 加载器并且没有公开很多配置选项)。
在Jinja2 Docs之后,我编写了这个自定义加载器,我希望每次都会触发模板重新加载,但它似乎也不起作用:
import settings
from bottle import jinja2_template
from bottle import Jinja2Template, template as base_template
class AutoreloadJinja2Template(Jinja2Template):
def loader(self, name):
def uptodate():
# Always reload the template if we're in DEVMODE (a boolean flag)
return not settings.DEVMODE
fname = self.search(name, self.lookup)
if fname:
with open(fname, "rb") as f:
source = f.read().decode(self.encoding)
return (source, fname, uptodate)
template = functools.partial(base_template,
template_adapter=AutoreloadJinja2Template,
template_lookup = settings.TEMPLATE_PATHS,
template_settings={
'auto_reload': settings.DEVMODE
}
)
在我重新启动 dev_appserver 之前,模板仍在缓存中。这一定是一个相当普遍的问题。有没有人有一个有效的解决方案?
更新:
我最终做了类似的事情:
class CustomJinja2Template(Jinja2Template):
if settings.DEVMODE:
def prepare(self, *args, **kwargs):
kwargs.update({'cache_size':0})
return Jinja2Template.prepare(self, *args, **kwargs)
template = functools.partial(original_template, template_adapter=CustomJinja2Template)
这会导致模板始终重新加载,但前提是已触及 python 模块。即,如果您只是编辑模板文件,则更改将不会生效,直到您编辑导入它的 python 文件之一。似乎模板仍在某处缓存。