Я использую шаблоны Jinja2 с Bottle.py и dev_appserver Google App Engine для разработки. Я хочу, чтобы шаблоны автоматически перезагружались при каждом запросе (или, в идеале, только когда они меняются), чтобы мне не приходилось постоянно перезапускать сервер.
Согласно документации по bottle, вы должны иметь возможность отключить кэширование шаблонов, вызвав bottle.debug(True)
.
Однако Jinja, похоже, все еще кэширует свои шаблоны. Я считаю, что это связано с тем, как написан адаптер bottle jinja2 (он просто использует загрузчик Jinja2 по умолчанию и не предоставляет много опций конфигурации).
Следуя Jinja2 Docs, я написал этот пользовательский Loader, который, как я ожидал, будет вызывать перезагрузку шаблонов каждый раз, но, похоже, он тоже не работает:
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. Должно быть, это довольно распространенная проблема. Есть ли у кого-нибудь решение, которое работает?
UPDATE:
В итоге я сделал что-то вроде:
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, который импортирует его. Похоже, что шаблоны все еще где-то кэшируются.