Какой лучший способ отключить кэширование шаблонов Jinja2 в bottle.py?

Я использую шаблоны 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, который импортирует его. Похоже, что шаблоны все еще где-то кэшируются.

9
задан leted 13 January 2012 в 01:43
поделиться