33

とても簡単だと思っていたことがどうやってできるのか、少し混乱しています。を使用して作成された簡単なアプリがありFlaskます。これは次のようになります。

from flask import Flask

app = Flask(__name__)

def _run_on_start(a_string):
    print "doing something important with %s" % a_string

@app.route('/')
def root():
    return 'hello world'

if __name__ == "__main__":
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        _run_on_start("%s" % DOM)
        app.run(debug=True)

私が見つけたのは、私の端末が_run_on_start他の通常のFlaskアプリデバッグコードではなくprintステートメントを出力しているということです。app.runの前に呼び出しを削除すると、出力は正常です。さらに、の出力が_run_on_start起動時に2回繰り返されることがわかりましたが、それが奇妙な出力なのか、関数が実際に2回呼び出されているのかはわかりません。

これは、を呼び出す前に関数呼び出しを追加する正しい方法ではないと思いますapp.run。Flaskのドキュメントを調べたところ、特定のリクエストの前後に関数を実行できるさまざまなデコレータについての言及が見つかりましたが、アプリサーバーの実行時に呼び出しを実行したいと思います。

さらに、このモジュールを別のモジュールから呼び出す場合、つまり、への呼び出しがない場合__name__ != "__main__"はそうではないことに気付きます_run_on_start

ここでの正しいアプローチは何ですか?CLと別のモジュールから開始する場合はどちらの場合も?

4

3 に答える 3

48

Flask.before_first_requestおそらく、次のようにデコレータを探していました。

@app.before_first_request
def _run_on_start(a_string):
    print "doing something important with %s" % a_string
于 2014-04-12T20:29:57.543 に答える
16

関数からの重複した出力は、リローダーによって説明できます。最初に行うことは、新しいスレッドでmain関数を開始して、ソースファイルを監視し、変更されたときにスレッドを再起動できるようにすることです。オプションでこれを無効にしuse_reloader=Falseます。

別のモジュールからサーバーを起動するときに関数を実行できるようにする場合は、関数を関数でラップし、他のモジュールからその関数を呼び出します。

def run_server(dom):
        _run_on_start("%s" % dom)
        app.run(debug=True, use_reloader=False)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        run_server(DOM)

「正しいアプローチ」は、ここで実際に達成しようとしていることによって異なります。組み込みサーバーは、アプリケーションを本番サーバーにデプロイする前にローカルテスト環境で実行することを目的としているため、別のモジュールからアプリケーションを起動するという問題は、それ自体ではあまり意味がありません。

于 2012-02-16T15:34:41.330 に答える
0
from flask import Flask

def create_app():
    app = Flask(__name__)
    def run_on_start(*args, **argv):
        print "function before start"
    run_on_start()
    return app

app = create_app()

@app.route("/")
def hello():
    return "Hello World!"
于 2019-02-17T16:54:32.427 に答える