在烧瓶/gunicorn 中初始化应用程序的位置

Posted

技术标签:

【中文标题】在烧瓶/gunicorn 中初始化应用程序的位置【英文标题】:Where in flask/gunicorn to initialize application 【发布时间】: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

【问题讨论】:

【参考方案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 函数。

以上是关于在烧瓶/gunicorn 中初始化应用程序的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx 和 gunicorn 运行烧瓶应用程序

无法在 gunicorn wsgi 服务器上运行烧瓶应用程序

如何从烧瓶中启动和停止子进程[重复]

Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?

Gunicorn 多个烧瓶工人和绑定任务 celery

如何在 docker 上运行 gunicorn