web-dev-qa-db-ja.com

テンプレートファイルの変更時にアプリを再読み込みFlask=

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

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

残念ながら、これは*。pyファイルに対してのみ機能するようで、この機能を他のファイルに拡張する方法を見つけられないようです。最も注目すべきは、テンプレートが変更されたときにFlaskがアプリを再起動することは非常に便利です。テンプレートでマークアップをいじり、変更が表示されないことで混乱した回数を数え切れませんでしたが、アプリがまだ古いバージョンのJinjaテンプレートを使用していることがわかりました。

それで、Flaskをtemplatesディレクトリに監視する方法はありますか、それともフレームワークのソースに飛び込む必要がありますか?

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


さらに調査した結果、テンプレートの変更がアプリ自体をリロードせずにリアルタイムで更新されることを発見しました。ただし、これはflask.render_templateに渡されるテンプレートにのみ適用されるようです。

しかし、私のアプリでは、Jinjaテンプレートで使用する再利用可能なパラメーター化されたコンポーネントが非常にたくさんあります。それらは{% macro %}sとして実装され、専用の「モジュール」に存在し、実際のページに{% import %}edされます。すべてのNiceおよびDRY ...は、インポートされたテンプレートがrender_templateをまったく渡さないため、変更がチェックされていないことを除きます。

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

まとめると、この現象の根源はジンジャとFlaskまたはWerkzeugの間のどこかにあるようです。私はそれがそれらのプロジェクトのいずれかのバグトラッカーへの旅行を保証するかもしれないと思います:)一方、私はjd。の答えを受け入れました私が実際に使用したソリューション-そしてそれは魅力のように動作します。

69
Xion

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

54
jd.

使用できます

TEMPLATES_AUTO_RELOAD = True

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

テンプレートソースの変更をチェックして、自動的にリロードするかどうか。デフォルトでは、値はNoneです。つまり、Flask=はデバッグモードでのみ元のファイルをチェックします。

107
Loris

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

if __== '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, Host='0.0.0.0')
37
silgon

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

  1. 関数before_requestを作成します

    def before_request():
        app.jinja_env.cache = {}
    
  2. アプリケーションに登録する

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

9
dikkini

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

@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の回答から取得

4
Garrett

Flaskの最新バージョンを使用し、runコマンドとdebugをtrueに設定すると、Flaskは、テンプレートの変更のためにリセットする必要がなくなります。 Shift + F5(またはShiftとリロードボタン)を試して、キャッシュされていないことを確認します。

2
Drakekin

私にとってはうまくいく:

 from flask import Flask, render_template, request, url_for, redirect
 app = Flask(__name__)
 app.config["TEMPLATES_AUTO_RELOAD"] = True

詳細は http://flask.pocoo.org/docs/1.0/config/ をご覧ください

2
Nick Marhal

http://flask.pocoo.org/docs/1.0/quickstart/ を参照し、FLASK_ENV=development

1
Naxos84

2019年6月現在の更新:

Dev-serverを実行するにはapp.run()よりも flask CLI をお勧めします。そのため、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は、Flask 1.1。の時点で--extra-files引数もサポートしています。

0
overseas