app.run() メソッドを使用して Flask アプリケーションを実行すると、サーバーの再起動を示す print ステートメントが表示される状況が発生することがあります。が2回出現します。この動作は、Werkzeug リローダーに起因している可能性があります。
Flask の開発サーバーを動作させる基礎となるライブラリである Werkzeug は、コードの変更と自動再起動を容易にする子プロセス メカニズムを採用しています。 app.run() を実行すると、リローダーはコードを継続的に監視する子プロセスを生成します。
これを説明するために、Werkzeug の restart_with_reloader() 関数を詳しく見てみましょう。この関数は subprocess.call() を呼び出してスクリプトを再度実行し、子プロセスを生成します。その結果、print ステートメントが 2 回観察されることになります。
この重複を排除するには、リローダーを無効にすることを検討してください。これを実現するには、app.run() で use_reloader を False に設定します:
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
または、flask run コマンドを使用するときにリローダーを無効にすることもできます:
FLASK_DEBUG=1 flask run --no-reload
別のオプションwerkzeug.serving.is_running_from_reloader() 関数を利用して、
ただし、モジュール グローバルが必要な場合は、@app.before_first_request デコレータを選択してください。このデコレータを使用すると、リロードごとに最初のリクエストを受信したときに 1 回呼び出される関数を指定できます。
@app.before_first_request def before_first_request(): print(f"########### Restarted, first request @ {datetime.utcnow()} ############")
リクエスト処理にフォークまたはサブプロセスを使用する本格的な WSGI サーバーで実行している場合に注意してください。 、before_first_request ハンドラーは、新しく作成されたサブプロセスごとに呼び出される可能性があります。
以上がFlask 開発サーバーが起動メッセージを 2 回出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。