我正在构建烧瓶应用程序并且这次决定尝试应用工厂方法,但是遇到了烧瓶迁移的麻烦并且无法找出简单的解决方案。
请注意,我想将配置位置作为选项传递给脚本
manage.py:
manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)
然后我需要创建migrate实例并向管理器添加命令:
with manager.app.app_context():
migrate = Migrate(current_app, db)
manager.add_command('db', MigrateCommand)
但尚未创建应用实例,因此无法
我知道我可以在创建管理器实例之前在环境变量中传递config并创建应用程序,但是如何使用管理器选项来完成它?
答案 0 :(得分:15)
使用init_app
选项时,您必须使用应用程序工厂函数,因为此函数将配置作为参数,并允许您使用正确的配置创建应用程序。
由于您有应用工厂,因此必须对所有扩展使用延迟初始化。您在不传递任何参数的情况下实例化扩展,然后在创建应用程序后在应用工厂函数中,在所有扩展上调用MigrateCommand
,然后传递app和db。
Manager
与此完全分开,您可以在不创建app和db实例的情况下将其添加到from app import create_app
from flask_migrate import MigrateCommand, Manager
manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)
manager.add_command('db', MigrateCommand)
。
示例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
db = SQLAlchemy()
migrate = Migrate()
def create_app(config):
app = Flask(__name__)
# apply configuration
# ...
# initialize extensions
db.init_app(app)
migrate.init_app(app, db)
return app
{{1}}