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。

但是在我能找到的每个解决方案中,我都需要创建一个继承app 的类,以覆盖__init__()并将对象作为参数,或者修改run()方法。

我目前的做法是:

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

这也是你会这样做的方式,还是有更好的方式来做到这一点?

谢谢!

这是此问题的更通用版本:Flask 中的 Web API

4

2 回答 2

19

看看应用程序工厂,它应该可以满足您的需求。您将创建一个返回您的 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)

Armin 对此的更多见解:https ://speakerdeck.com/mitsuhiko/advanced-flask-patterns

于 2013-02-18T11:18:35.420 回答