2016-09-12 4 views
1

Flaskにリクエストごとに設定ファイルをリロードさせる慣用方法はありますか?これは、運用中にサーバーをシャットダウンして再起動することなく、パスワードやその他の設定に関連する項目を変更できるようにするためです。Flaskの各リクエストでコンフィグレーションファイルをリロードするには?

編集:app.run(debug=True)は、サーバーを再起動するため使用できません。本番環境では使用しないでください。次のようなおそらくデコレータ

def reload_configuration(func): 
    @wraps(func) 
    def _reload_configuration(*args, **kwargs): 
     #even better, only reload if the file has changed 
     reload(settings) 
     app.config.from_object(settings.Config) 
     return func(*args, **kwargs) 

    return _reload_configuration 

@app.route('/') 
@reload_configuration 
def home(): 
    return render_template('home.html') 

それが関連している場合は、ここで私は今、設定をロードしています方法です:

マイapp/app/__init__.pyファイル:

from flask import Flask 
from settings import Config 

app = Flask(__name__) 
app.config.from_object(Config) 

# ... 

マイapp/app/settings.pyファイル:

class Config(object): 
    SQLALCHEMY_TRACK_MODIFICATIONS = False 
    SECRET_KEY = os.urandom(32) 
    # ... 

try: 
    from app.local_settings import Config 
except ImportError: 
    pass 
+1

app.run(debug = True)は機能しませんか? – iScrE4m

+0

@ iScrE4mいいえ。 2つの理由から、1)設定ファイルをリロードするだけでなく、サーバー全体を再起動します。 2)私はこれをプロダクションで実行しています –

+0

前のリクエストハンドラで 'app.config.from_object'を呼び出すだけです。 – dirn

答えて

3

アプリケーションが要求の処理を開始した後、設定を安全に/正しく再ロードすることはできません。構成はのみです。は、アプリケーションのセットアップ中に読み取られることを意味します。主な理由は、プロダクションサーバーが複数のプロセスを使用して実行されている(またはサーバー間で分散されている)ため、構成変更要求を処理するワーカーは他のワーカーにアクセスして変更するように指示しないためです。さらに、一部のconfigはリロードされるように設計されていないため、他のすべてのワーカーに通知して適切にリロードすることができたとしても、影響はありません。

プロダクションWSGIサーバーは正常にリロードできます。つまり、応答を完了するまで実行中のワーカーを殺すことはないため、実際にはダウンタイムが問題になるはずはありません。それが(本当にそうでない)場合、あなたはこの答えの範囲を超えているような大きさになっています。あなたが動的に更新することができます設定を使用する必要がある場合、あなたはすべてのコードを記述する必要があります

:中

優雅リロードあなたはそれを期待しています。 before_requestハンドラを使用して、各要求を新しくロードすることができます。ただし、configを使用して作成していないものは、configの変更を期待していない可能性があります。

関連する問題