テンプレートファイルが変更されたときにFlaskアプリを再読み込みする


95

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

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

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

では、テンプレートディレクトリにFlaskモニターファイルを置く方法はありますか、それともフレームワークのソースに飛び込む必要がありますか?

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


さらに、問い合わせの後、私は、テンプレートの変更が実際にあることを発見したされているアプリ自体をリロードせずに、リアルタイムに更新します。ただし、これはに渡されるテンプレートにのみ適用されるようflask.render_templateです。

しかし、たまたま私のアプリには、Jinjaテンプレートで使用する、再利用可能なパラメーター化されたコンポーネントがたくさんあります。これらはとして実装され{% macro %}、専用の「モジュール」に常駐し、{% import %}実際のページに組み込まれます。インポートされたテンプレートはまったく通過しないため、変更されたテンプレートが明らかにチェックされないことを除いて、すべてが素晴らしく、DRYですrender_template

(不思議なことに、これはを介して呼び出されたテンプレートでは発生しません{% extends %}。については{% include %}、実際には使用しないのでわかりません。)

まとめると、この現象のルーツは、ジンジャとフラスコまたはウェルクツグの間のどこかにあるようです。これらのプロジェクトのいずれかでバグトラッカーにアクセスする必要があると思います:)その間、私はjdを受け入れましたの答えは、それが実際に使用したソリューションであり、魅力のように機能するためです。


3
アプリがDEBUG = Trueで構成されていることを確認してください。ドキュメントを参照してください。
Alex Morega

回答:


65

私の経験では、テンプレート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


いい物!Flask.runWerkzeugのドキュメントにつながるドキュメントのリンクを見逃したことを認めます。しかし、この特定のオプションは、Flaskのドキュメントで少なくとも言及するのに十分役立つようです。
シオン

誰もが言うエラーが発生した場合No such file or directory、のように相対パスを使用してみてください:extra_dirs = ['./directory/to/watch',]
ケビン・

3
もしあなたが何であるかについて混乱しているならpath、それはos.pathです。それは言及する価値があると思った
bjesus

静的ファイルを変更した後の自動再読み込みについては、こちらを参照してください。
シマナッチ

1
flask runコマンドラインから実行するときに追加のファイルを指定する方法はありますか?
Michael Scheper

143

あなたは使うことができます

TEMPLATES_AUTO_RELOAD = True

http://flask.pocoo.org/docs/1.0/config/から

テンプレートソースの変更をチェックして、自動的に再読み込みするかどうか。デフォルトの値はNoneです。これは、Flaskがデバッグモードでのみ元のファイルをチェックすることを意味します。


11
このソリューションは従来のものであり、ドキュメントでサポートされており、理解しやすく、実装も簡単です。それは受け入れられるべきです!
Carolyn Conway

私はこの答えを試しましたが、1度しか機能しませんが、次の更新では機能しません
medev21

3
他の人へのメモ:私はそうしましたapp.config['TEMPLATES_AUTO_RELOAD'] = True、そして何らかの理由で、デバッグモードでそうであるように、テンプレートが変更されたときにサーバーが自動再起動するのを期待しました。再起動はしませんが、レンダリングするテンプレートを更新します。
cs01

3
これが0.12で機能しない理由は何ですか?またはこれが正しく設定されないようにする他の設定ですか?
user805981 2017年

3
@Federer以前のように動作していないようです...以前は、テンプレートディレクトリとサブディレクトリの変更を検出し、サーバーをリロードしていました...これは0.12の新しいものですか?かわった?
user805981 2017年

54

jinjaテンプレートを使用する場合は、いくつかのパラメータを設定する必要があります。私のpython3の場合、私は次のコードでそれを解決しました:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

1
あなたは私の正気を救った。ありがとうございました。
Nostalg.io 2017

私もその問題で苦労していました。私は私が助けることができてうれしいです;)
silgon '20 / 07/20

これはフラスコ1.0.2で私のために働いています、しかし私はホスト引数を持っていません。
Enrico Borba

ええ@EnricoBorba、あなたはおそらくそれを必要としないでしょう。私は通常、Dockerを使用してローカルでデバッグするため、これを使用します。別のコンテナーからアプリケーションにアクセスする必要がある場合もあります。参考資料
シルゴン

@silgon Yeaわかりました。私は主にコメントに追加して、Flaskバージョン1.0.2の新規インストールで何が機能したかを明確にしました
Enrico Borba


10

私にとってTEMPLATES_AUTO_RELOAD = Trueは実際には機能しません(0.12バージョン)。私はjinja2と私がやったことを使います:

  1. 関数を作成する before_request

    def before_request():
        app.jinja_env.cache = {}
  2. アプリに登録

    app.before_request(before_request)
  3. それでおしまい。


3
ギャレット、私はこれらのオプションなしではテストしませんでした。
dikkini 2017

ステップ3は本当に必要ではありません。私にとっては非常にうまくいきました。
Ricardo Ribeiro

4

私のために働いたのはこれを追加することです:

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.host_url or '0.0.0.0' in request.host_url:
        app.jinja_env.cache = {}

@dikkiniの回答から引用


2

WindowsでFlaskの最新バージョンを使用し、runコマンドとdebugをtrueに設定します。テンプレートの変更を有効にするためにFlaskをリセットする必要はありません。Shift + F5(またはShift +再読み込みボタン)を試して、何もキャッシュされていないことを確認します。



1

2019年6月に更新:

開発サーバーを実行するには、フラスコCLIがapp.run()よりも推奨されるため、CLIを使用したい場合、承認されたソリューションを使用できません。

この記事の執筆時点で開発バージョンのFlask(1.1)を使用すると、環境変数FLASK_RUN_EXTRA_FILESを設定できます。これは、受け入れられた回答と実質的に同じことを行います。

このgithubの問題を参照してください。

使用例:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

Linuxで。複数の追加ファイルを指定するには、ファイルパスをコロンで区切ります。、例えば

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

CLIは、--extra-filesFlask 1.1以降の引数もサポートしています。


マイナーアップデート。「フラスコCLI」へのリンクは、現在のバージョンに更新する必要があります。 Flask.palletsprojects.com/en/1.1.x/cli さもなければ感謝:)
CodingMatters

1

テンプレートは自動的にリロードされます。なぜctrl+f5Webページを更新するのではなく、Webブラウザーは通常キャッシュを保存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.