【问题标题】:Where in flask/gunicorn to initialize application在烧瓶/gunicorn 中初始化应用程序的位置
【发布时间】:2014-04-11 04:37:36
【问题描述】:

我正在使用 Flask/Gunicorn 运行 Web 应用程序,并且对生命周期管理有疑问。我在 Java 世界中使用 servlet 有更多经验。

我正在为服务创建一个宁静的界面。该服务始终在服务器上运行,并与一组子服务器进行通信和控制。在 Java 中,我的服务将通过侦听器和 servlet 初始化方法创建和初始化(例如,传统上在 main() 中找到的设置)。

Flask 中的等效设置和配置在哪里?我正在考虑创建数据库连接池、向子服务器发送 hello 消息、将持久化系统状态重置为初始值等任务。

那会在 Flask 的 before_first_request 方法中使用吗?

基于@Pyrce 的cmets,我想我可以创建一个main.py

app = Flask(your_app_name)

#initialization code goes here

然后运行:

>gunicorn main:app

【问题讨论】:

    标签: python web-services flask gunicorn


    【解决方案1】:

    您仍然可以使用相同的 main() 方法范例。请参阅下面的启动代码:

    app = Flask(your_app_name) # Needs defining at file global scope for thread-local sharing
    
    def setup_app(app):
       # All your initialization code
    setup_app(app)
    
    if __name__ == '__main__':
        app.run(host=my_dev_host, port=my_dev_port, etc='...')
    

    before_first_request 方法也可以处理所有这些项目。但是你会在第一次请求而不是服务器启动时延迟设置。

    【讨论】:

    • 其实再想一想,那不是只运行开发服务器而不运行 WSGI 吗?
    • 除非我误解了你的问题,否则不会。它确实取决于您用于管理服务器的内容,但来自文档“请记住,您的 Flask 应用程序对象是实际的 WSGI 应用程序。”
    • 这在一定程度上取决于您在运行 Gunicorn 时无法访问 main 方法。我想我可以将该代码放在不检查__name__ == '__main__' 的根模块中。我会用一个我在想什么的例子来更新我的问题。你觉得对吗?
    • 啊,是的,我现在完全明白你的意思了。要使用 guinicorn 启动,如果存在无法配置 guiicorn 的设置,那么您只需要在应用程序上运行 setup 即可运行。编辑答案以反映这一点。
    • 我怀疑当您使用生产应用程序服务器(如 uwsgi)包装烧瓶应用程序时,此解决方案是否有效。烧瓶“app”对象被传递给 uwsgi,并且该对象在其范围内没有 setup_app 函数。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2016-04-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2020-10-26
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多