14

オブジェクトをフラスコアプリに正しい方法で渡す方法について疑問がありました。

アイデアは単純です。

アプリケーションのAPIを作成したいのですが、これは、フラスコアプリケーションによって処理されたhttpリクエストが、メインアプリケーションのメソッドをトリガーすることを意味します。

そのためには、フラスコが他のプロセスを何らかの方法で認識している必要があります。

現在、私は次のようなものを持っています:

if __name__ == '__main__':
    Logger = MyProcess()
    app.run()

私はそのようなことをすることができる必要があります:

@app.route('/nb_trendy')
def nb_trendy():

    res = Logger.get_trendy()
    return jsonify(res)

つまり、アプリにLoggerのハンドルを与えるか、アプリ内でLoggerを直接定義する必要があります。

しかし、私が見つけることができる各ソリューションでは、アプリを継承するクラスを作成して、オブジェクトをオーバーライド__init__()してパラメーターとして受け取るか、run()メソッドを変更する必要があります。

私がそれをする現在の方法はしかしです:

class MyFlask(Flask):
    def __init__():
        Flask.__init__()
        Logger = MyProcess()

これはあなたがそれをする方法でもありますか、それともこれを行うためのより良い方法がありますか?

ありがとう!

この質問のより一般的なバージョンは次のとおりです。FlaskのWebAPI

4

2 に答える 2

19

あなたが探していることをするはずのapplication factoryを見てください。ロガーを送信する Flask アプリを返すファクトリを作成します。次のようになります。

def create_app(logger_instance):
    app = Flask(__name__)
    app.config['LOGGER'] = logger_instance
    return app

そして、runserver.py で、ロガーを作成して渡します。

from yourapp import create_app
if __name__ == '__main__':
    logger = MyProcess()
    app = create_app(logger)
    app.run()

それが完了すると、アプリは 内のロガーを参照できますapp.config['LOGGER']

于 2013-02-15T21:13:25.583 に答える
1

これにはフラスコアプリコンテキストを使用することをお勧めします

from flask import _app_ctx_stack 

def getLogger():
    appContext = _app_ctx_stack.top
    logger = getattr(appContext, "Logger", None)
    if logger is None:
        logger = MyProcess()
        appContext.Logger = logger
    return logger

....

@app.route('/nb_trendy')
def nb_trendy():
    logger = getLogger()
    res = logger.get_trendy()
    return jsonify(res)

それに関するアーミンからのより多くの洞察:https ://speakerdeck.com/mitsuhiko/advanced-flask-patterns

于 2013-02-18T11:18:35.420 に答える