2012-03-01 8 views
48

を変更し、使用してフラスコアプリケーションを実行しているときは、内蔵のサーバー(Flask.run)、それはその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 %}として、私は私が実際にそれらを使用しないよう見当がつかない。)

ので、この現象のルーツをラップしますJinjaとFlaskまたはWerkzeugのどこかにあるようだ。私はそれがどちらかのプロジェクトのバグトラッカーへの旅行を保証するかもしれないと思います:)一方、私はjdを受け入れました。の答えは、これが私が実際に使った解決策だからです。そしてそれは魅力のように機能します。

+2

:のpython3と私の場合、私は次のコードでそれを解決しました#デバッグモード)。 –

答えて

43

私の経験では、render_template()が呼び出されるたびにディスクからロードする必要があるため、テンプレートではアプリケーションを再起動する必要はありません。多分あなたのテンプレートは異なって使用されるでしょう。

テンプレートが変更されたときにアプリケーションをリロードするには、引数をファイル名の集合であるFlask().run()に渡すことができます。これらのファイルを変更すると、リロードがトリガーされます。

例:

from os import path 

extra_dirs = ['directory/to/watch',] 
extra_files = extra_dirs[:] 
for extra_dir in extra_dirs: 
    for dirname, dirs, files in os.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

+0

良いもの!私はWerkzeugの文書につながる 'Flask.run'の文書のリンクを見逃したことを認めます。しかし、この特定のオプションはFlaskのドキュメントで言及されているようには十分役に立つと思われます。 – Xion

+0

'No such file or directory'というエラーが発生した場合は、' extra_dirs = ['./directory/to/watch'、] ' – Kevin

+2

のような相対パスを使用してみてください。 'それは' os.path'です。それは言及する価値があると思った – bjesus

0

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

59

あなたは、テンプレートSOUの変更をチェックするかどうかhttp://flask.pocoo.org/docs/0.11/config/

から

TEMPLATES_AUTO_RELOAD = True 

を使用することができますそれを自動的にリロードしてください。デフォルトでは値はNoneです。つまり、Flaskは元のファイルをデバッグモードでのみチェックします。

+3

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

+0

私はこの回答を試みましたが、一度しか動作しません。別のリフレッシュ後に動作しませんでした。 – medev21

+0

これは正解です。ありがとうございます。 – Kingname

5

実際に私のためにTEMPLATES_AUTO_RELOAD = Trueは機能しません(0.12バージョン)。私はJinja2のと私が行っているを使用します。

  1. は、関数を作成しますbefore_request

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

    app.before_request(before_request) 
    
  3. DEBUGTESTINGTEMPLATES_AUTO_RELOADオプション

    012に登録します
  4. これだけです。

+0

私はステップ3が不要だと思いますよね? – Garrett

+0

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

+0

ステップ3は本当に必要ではない、それは私に非常によく働いた。 –

3

何私のために働いたことがちょうどこれを追加している:

@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の答え @から取られた)

18

をあなたはjinjaテンプレートで作業しているとき、あなたはいくつかのパラメータを設定する必要があります。 [ドキュメント](http://flask.pocoo.org/docs/quickstart/を参照し、アプリがDEBUG = Trueので構成されていることを確認します

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

あなたは私の正気を保存しました。ありがとうございました。 –

+0

私もこの問題で苦労していました。私が助けることができてうれしいです;) – silgon

関連する問題