[解決済み] テンプレートファイル変更時にFlaskアプリを再読み込みする
質問
デフォルトでは、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
関連
-
[解決済み】コード変更時のPython Flaskアプリの自動再読み込み
-
[解決済み】Flask/Jinja2を使ってテンプレートにHTMLを渡す
-
[解決済み] ネストしたdictからのPythonデータクラス
-
[解決済み] Google App EngineのためのFlaskとwebapp2の比較
-
[解決済み] Pythonで文字列が数字で始まるかどうかを判断するには?
-
[解決済み] python BeautifulSoup テーブルのパース
-
[解決済み] 条件を満たした場合にNumpyの要素を置き換える
-
[解決済み] Python 2 で HEAD HTTP リクエストを送信するには?
-
[解決済み] Pythonスクリプトをコンパイルする(実行しない) [重複]。
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Flaskの開発サーバーをネットワーク上で見えるように設定する
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] and "と "or "はブール値以外ではどのように作用するか?
-
[解決済み] virtualenvのどこにカスタムコードを置くか?
-
[解決済み] ne__は__eq__の否定として実装されるべきか?
-
[解決済み] 2つのデータフレームをマージしようとすると、ValueErrorが発生します。
-
[解決済み] Pythonでファイルがバイナリ(非テキスト)かどうかを検出するにはどうしたらいいですか?
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。