Запустите несколько разных приложений фляг с помощью manage.py (фласк-скрипт)

У меня есть приложение Flask, настроенное так, чтобы оно могло запускать два разных сайта (сайты используют общую бизнес-логику и модели базы данных, поэтому они используют один и тот же сервер). Один — это обычный веб-сайт, другой — сайт, на котором выполняются задачи (это веб-интерфейс для запуска длинных задач в сельдерей).

В настоящее время приложение использует Flask-Script (команда manage.py) для запуска обычного веб-сайта, но я хотел бы использовать тот же сценарий для запуска сайта задач.

В Flask-Script кажется, что все команды являются процессами, выполняемыми в одном приложении. Возможно ли, чтобы manage.py запускал два разных приложения?

Теперь мой код выглядит следующим образом, где create_app — это фабричная функция для создания приложения Flask для веб-сайта, а сервер задач — это фабричная функция для создания веб-сайта сервера задач.

import os
from flask_script import Manager
from app import create_app, database, taskserver

if os.getenv('FLASK_CONFIG'):
    app = create_app(os.getenv('FLASK_CONFIG'))
    manager = Manager(app)
else:
    app = create_app
    manager = Manager(app)
    manager.add_option('-c', '--config_name', dest='config_name', required=False)

@manager.shell
def make_shell_context():
    from app.models.data import base_models
    return dict(app=app, db=database, models=base_models)

if __name__ == "__main__":
    manager.run()

Я надеюсь, что кто-то знает, как адаптировать сценарий manage.py, чтобы иметь возможность запускать любой из них.

ОБНОВЛЕНИЕ:

Благодаря @Joro Tenev проблема решена. Код, который я использовал в конечном итоге:

import os
from flask_script import Manager
from app import create_website, create_taskserver


def make_app(app_type, config_name):
    if os.getenv('FLASK_CONFIG'):
        config_name = os.getenv('FLASK_CONFIG')
    if app_type == 'webserver':
        return create_website(config_name)
    else:
        return create_taskserver(config_name)  # i don't know how your factory works, so adjust accordingly

manager = Manager(make_app)

manager.add_option('-a', '--app_type', dest='app_type', required=True)
manager.add_option('-c', '--config_name', dest='config_name', required=False)

И для запуска разных приложений я использую:

python manage.py --app_type=webserver --config_name=development runserver
python manage.py --app_type=taskserver --config_name=development runserver

person Erik Oosterwaal    schedule 05.08.2016    source источник


Ответы (1)


Вы можете передать функцию конструктору Manager. Функция должна возвращать приложение Flask. Вы также можете передать параметры функции с помощью manager.add_option

manager.add_option('-a','--app_type', dest='app_type',required=True)
def make_app(app_type):
  if app_type =='webserver':
    return create_app(os.getenv('FLASK_CONFIG'))
  elif:
    return taskserver(os.getenv('FLASK_CONFIG')) # i don't know how your factory works, so adjust accordingly

manager = Manager(make_app)

И вы будете использовать его с

$ python manage.py --app_type='webserver'

Надеюсь это поможет :)

person Joro Tenev    schedule 07.08.2016
comment
Спасибо, Йоро. Мне нужно было изменить некоторые незначительные вещи, например, аргумент командной строки не нуждался в кавычках, но теперь он работает! Я добавил полное решение в исходный вопрос. - person Erik Oosterwaal; 08.08.2016