如何在Gunicorn启动主要功能之前触发功能

时间:2019-02-09 21:22:11

标签: python-3.x flask gunicorn

我正在Docker环境中使用Gunicorn设置Flask应用程序。

当我想旋转容器时,如果数据库为空,我希望Flask容器创建数据库表(基于模型)。我在wsgi.py文件中包含了一个函数,但这似乎在每次初始化worker时都会触发该函数。之后,我尝试在gunicorn.py配置文件中使用服务器挂钩,如下所示。

"""gunicorn WSGI server configuration."""
from multiprocessing import cpu_count
from setup import init_database

def on_starting(server):
    """Executes code before the master process is initialized"""
    init_database()


def max_workers():
    """Returns an amount of workers based on the number of CPUs in the system"""
    return 2 * cpu_count() + 1


bind = '0.0.0.0:8000'
worker_class = 'eventlet'
workers = max_workers()

我希望gunicorn自动触发on_starting函数,但是该钩子似乎永远不会触发。该应用似乎正常启动,但是当我尝试发出要插入数据库条目的请求时,它说该表不存在。如何触发on_starting挂钩?

2 个答案:

答案 0 :(得分:1)

我通过在创建工作人员为我的应用服务之前先预加载应用来解决了我的问题。我是通过将以下行添加到我的gunicorn.py配置文件中来完成此操作的:

...
preload_app = True

通过这种方式,应用程序已经在运行,并且可以接受创建必要的数据库表的命令。

答案 1 :(得分:0)

Gunicorn导入模块以获取app(或您告诉Gunicorn WSGI应用程序对象所在的任何其他名称)。在该导入过程中(即Gunicorn开始将流量定向到该应用程序之前),代码正在执行。在创建db(假设您正在使用SQLAlchemy)并导入模型之后,将启动代码放在此处,并导入模型(以便SQLAlchemy知道然后知道要创建的表)。

或者,使用预先创建的数据库填充容器。