在烧瓶/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 中初始化应用程序的位置的主要内容,如果未能解决你的问题,请参考以下文章
无法在 gunicorn wsgi 服务器上运行烧瓶应用程序