Как запустить функцию, прежде чем Gunicorn начнет свой основной процесс - PullRequest
0 голосов
/ 10 февраля 2019

Я настраиваю приложение Flask с Gunicorn в среде Docker.

Когда я хочу ускорить свои контейнеры, я хочу, чтобы мой контейнер Flask создавал таблицы базы данных (на основе моих моделей), если моя база данных пуста.Я включил функцию в свой файл wsgi.py, но, похоже, она запускается при каждой инициализации работника.После этого я попытался использовать серверные перехватчики в моем конфигурационном файле 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 голосов
/ 10 февраля 2019

Я исправил свою проблему, предварительно загрузив приложение перед созданием рабочих для обслуживания моего приложения.Я сделал это, добавив эту строку в мой gunicorn.py файл конфигурации:

...
preload_app = True

Таким образом, приложение уже запущено и может принимать команды для создания необходимых таблиц базы данных.

0 голосов
/ 10 февраля 2019

Gunicorn импортирует модуль, чтобы получить значение app (или любое другое имя, которое вы сообщаете Gunicorn, в котором живет объект приложения WSGI).Во время этого импорта, который происходит до того, как Gunicorn начинает направлять трафик в приложение, выполняется код.Поместите туда свой код запуска после того, как вы создали db (при условии, что вы используете SQLAlchemy) и импортировали свои модели (чтобы SQLAlchemy узнала об этом и, следовательно, узнала, какие таблицы создавать).

В качестве альтернативы, заполните ваш контейнер предварительно созданной базой данных.

...