将另一个对象传递给主Flask应用

14 投票
2 回答
11987 浏览
提问于 2025-04-17 15:47

我对如何正确地将一个对象传递给Flask应用有些疑问。

这个想法很简单。

我想为我的应用创建一个API,这意味着通过我的Flask应用处理的HTTP请求会触发我主应用中的一些方法。

为此,我需要让Flask知道我的其他进程,无论用什么方式。

目前,我有这样的代码:

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中的Web API

2 个回答

1

你可能想要使用 Flask 的应用上下文来解决这个问题。

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

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'] 来使用这个日志记录器了。

撰写回答