私は開発のためにBottle.pyとGoogle App Engineのdev_appserverでJinja2テンプレートを使用しています。私は、テンプレートを自動的にすべての要求に(または理想的には変更時に)リロードして、サーバーを再起動する必要はありません。bin.pyのJinja2テンプレートキャッシュを無効にする最も良い方法は何ですか?
ボトルのドキュメントによると、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。これはかなり一般的な問題でなければなりません。誰にも解決策がありますか?
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ファイルの1つを編集するまで変更内容が反映されません。あたかもテンプレートがまだどこかにキャッシュされているようです。 Jinja2の中
cache_size = 0引数がview()デコレータまたはtemplate()関数を使用して私のために機能しなかったため、また、(reloader = True)を実行すると、 "ローカル変数 'lockfile'が割り当て前に参照されます。" – arkanciscan
@arkanciscanこのバグはおそらく自分のresponseqとは関係ありませんが、大丈夫です。ご存知のように、あなたのコメントをボトルの問題として報告しました(https://github.com/defnull/bottle/issues/278)。あなたはgithubのバグについてもっと詳しく説明できますか?どのサーバーアダプターを使用していますか?ありがとう! – iurisilvio
+1バグレポートのため、ありがとう:) – defnull