59

私の目標は、Flask アプリケーションの起動後に任意のコードを実行することです。これが私が持っているものです:

def run():
    from webapp import app
    app.run(debug=True, use_reloader=False)

理想的には、これを行うことができます:

def run():
    from webapp import app
    app.run(debug=True, use_reloader=False)
    some_code()

しかし、コードは を超えて継続しないapp.run()ため、 some_code() は実行されません。

私が現在取り組んでいる解決策は、 app.run() とは別のスレッドで some_code() を実行し、これを設定する最初のリクエスト関数の前に作成することです:

app.is_running = True

次に、 some_code() を取得してアプリへの基本的なリクエストを送信し、「最初のリクエストの前」コードが実行されるようにします。これはかなり複雑で、文書化するのは難しいでしょう。Flask で既に提供されている app.is_running パラメータを使用するか、@app.after_server_startデコレータを使用したいのですが、私の知る限り、どちらも存在しません。

このコードを改善するのを手伝ってください。


死後: この問題について考えるたびに、@app.after_server_startデコレータが存在することを願っています。

4

7 に答える 7

35

フラスコアプリケーションが開始された後、厳密には最初のリクエストの前にコードを実行する必要があり、 @app.before_first_request が処理できるように最初のリクエストの実行によってトリガーされない場合は、CESCO が言ったように、Flask_Script を使用する必要がありますが、 runserver コマンドを @manager.command で上書きする代わりに、クラス Server をサブクラス化し、__call __ メソッドを上書きできます。

from flask import Flask
from flask_script import Manager, Server

def custom_call():
    #Your code
    pass

class CustomServer(Server):
    def __call__(self, app, *args, **kwargs):
        custom_call()
        #Hint: Here you could manipulate app
        return Server.__call__(self, app, *args, **kwargs)

app = Flask(__name__)
manager = Manager(app)

# Remeber to add the command to your Manager instance
manager.add_command('runserver', CustomServer())

if __name__ == "__main__":
    manager.run()

このようにして、runserver コマンドのデフォルト オプションを上書きしません。

于 2016-08-22T01:50:56.467 に答える
9

Flask-Scriptを使用してアプリを実行し、次のように runserver クラス/メソッドを上書きします

# manage.py

from flask_script import Manager

from myapp import app

manager = Manager(app)

def crazy_call():
    print("crazy_call")

@manager.command
def runserver():
    app.run()
    crazy_call()

if __name__ == "__main__":
    manager.run()
于 2015-11-15T16:56:36.407 に答える