開発には、Bottle.py と Google App Engine の dev_appserver で Jinja2 テンプレートを使用しています。サーバーを再起動し続ける必要がないように、リクエストごとに (または理想的にはテンプレートが変更された場合にのみ) テンプレートを自動的に再読み込みする必要があります。
bottle's docs によると、 を呼び出すことでテンプレートのキャッシュを無効にできるはずです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 ファイルの 1 つを編集するまで、変更は有効になりません。テンプレートがまだどこかにキャッシュされているようです。