デフォルトでは、組み込みサーバー(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。の答えを受け入れました私が実際に使用したソリューション-そしてそれは魅力のように動作します。
私の経験では、テンプレートは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
使用できます
TEMPLATES_AUTO_RELOAD = True
http://flask.pocoo.org/docs/1.0/config/ から
テンプレートソースの変更をチェックして、自動的にリロードするかどうか。デフォルトでは、値はNoneです。つまり、Flask=はデバッグモードでのみ元のファイルをチェックします。
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')
実際、私にとってTEMPLATES_AUTO_RELOAD = True
は機能しません(0.12バージョン)。私はjinja2と私がやったことを使用します:
関数before_request
を作成します
def before_request():
app.jinja_env.cache = {}
アプリケーションに登録する
app.before_request(before_request)
それでおしまい。
私のために働いたのはこれを追加するだけです:
@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の回答から取得)
Flaskの最新バージョンを使用し、runコマンドとdebugをtrueに設定すると、Flaskは、テンプレートの変更のためにリセットする必要がなくなります。 Shift + F5(またはShiftとリロードボタン)を試して、キャッシュされていないことを確認します。
私にとってはうまくいく:
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/ をご覧ください
http://flask.pocoo.org/docs/1.0/quickstart/ を参照し、FLASK_ENV=development
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
引数もサポートしています。