将另一个物体传递给主烧瓶应用程序

时间:2013-02-13 18:02:42

标签: python flask

我怀疑如何以正确的方式将对象传递给烧瓶应用程序。

这个想法很简单。

我想为我的应用程序创建一个api,这意味着我的flask应用程序处理的http请求将在我的主应用程序中触发meothd。

为此,我需要知道我的其他过程,无论如何。

目前,我有类似的内容:

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

我需要能够做到这样的事情:

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

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

这意味着我要么在Logger上给应用程序一个句柄,要么直接在app中定义Logger。

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

我现在这样做的方式是:

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

这也是你做的方式,还是有更好的方法呢?

谢谢!

以下是此问题的更一般版本:Web API in Flask

2 个答案:

答案 0 :(得分:11)

看看application factories,它应该做你想要的。你创建了一个工厂,它返回你要发送记录器的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']内的记录器。

答案 1 :(得分: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