1. ホーム
  2. python

[解決済み] テンプレートファイル変更時にFlaskアプリを再読み込みする

2022-05-13 07:07:29

質問

デフォルトでは、Flaskアプリケーションをビルトインサーバ( Flask.run ) を使って Flask アプリケーションを実行する場合、Python ファイルを監視し、そのコードが変更されると自動的にアプリを再読み込みします。

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

残念ながら、これは *.py ファイルでのみ動作し、他のファイルにこの機能を拡張する方法は見つからないようです。最も重要なのは、Flaskがアプリケーションを再起動する際に テンプレート が変更されたときに、Flaskがアプリを再起動するのは非常に便利です。テンプレートのマークアップをいじっていて、何の変更も見られないことに混乱し、アプリがまだ古いバージョンの Jinja テンプレートを使っていることに気づいたことが何度もあります。

というわけで、Flaskに テンプレート ディレクトリにあるファイルを監視させる方法はありますか、それともフレームワークのソースに潜る必要がありますか?

編集 : 私はUbuntu 10.10を使用しています。他のプラットフォームでは実際に試していません。


さらなる調査の後、私は、テンプレートの変更が実際に がリアルタイムで更新され、アプリ自体を再読み込みする必要はありません。しかし、これは、テンプレートが flask.render_template .

しかし、私のアプリでは、Jinjaテンプレートで使用する、再利用可能でパラメトリックなコンポーネントがかなり多くあります。これらは {% macro %} として実装され、専用の "modules" に存在し、そして {% import %} を実際のページに組み込んでいます。すべて素晴らしく、DRYです...ただし、インポートされたテンプレートは、明らかに render_template をまったく通過しないからです。

(不思議なことに、この現象は {% extends %} . に関しては {% include %} については、私は実際に使っていないのでわかりません)。

つまり、この現象のルーツは、JinjaとFlaskまたはWerkzeugの間のどこかにあるようです。私は、それがこれらのプロジェクトのいずれかのバグトラッカーへの旅を正当化するかもしれないと思います :) 一方、私は jd. の回答は、私が実際に使用した解決策であり、魅力的に機能するからです。

どのように解決するのですか?

私の経験では、テンプレートは毎回ディスクから読み込まれるため、更新するためにアプリケーションを再起動する必要さえありません。 render_template() が呼び出されるたびにディスクから読み込まれるはずだからです。テンプレートが異なる方法で使用されているのかもしれません。

テンプレート(あるいは他のファイル)が変更されたときにアプリケーションを再読み込みするためには、アプリケーションに渡された extra_files 引数を Flask().run() は、監視するファイル名のコレクションです。これらのファイルに何らかの変更があった場合、リローダが起動します。

例を示します。

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

こちらをご覧ください。 http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple