У меня есть приложение Flask, настроенное так, чтобы оно могло запускать два разных сайта (сайты используют общую бизнес-логику и модели базы данных, поэтому они используют один и тот же сервер). Один — это обычный веб-сайт, другой — сайт, на котором выполняются задачи (это веб-интерфейс для запуска длинных задач в сельдерей).
В настоящее время приложение использует Flask-Script (команда manage.py) для запуска обычного веб-сайта, но я хотел бы использовать тот же сценарий для запуска сайта задач.
В Flask-Script кажется, что все команды являются процессами, выполняемыми в одном приложении. Возможно ли, чтобы manage.py запускал два разных приложения?
Теперь мой код выглядит следующим образом, где create_app — это фабричная функция для создания приложения Flask для веб-сайта, а сервер задач strong> — это фабричная функция для создания веб-сайта сервера задач.
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