2016-08-05 6 views
0

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

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

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

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

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, чтобы иметь возможность запустить любой из них.

UPDATE:

Благодаря @Joro Тенев, проблема решена. код я в конечном итоге это:

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 

ответ

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' 

Надеется, что это помогает :)

+0

Спасибо JORO, Были некоторые незначительные вещи, которые я необходимо было изменить, например, аргумент командной строки не нуждался в кавычках, но теперь он работает! Я добавил полное решение в исходный вопрос. –

Смежные вопросы