Flask-migrate与Dash Eager布局加载不兼容

时间:2019-10-21 16:48:40

标签: python flask plotly-dash flask-migrate

由于急于加载布局,我在管理数据库迁移时遇到问题。在我的配置中,Dash在执行迁移之前执行数据库查询以产生布局。然后,如果db模式发生变化,所有这些查询将引发异常。

我的应用程序的结构如下:

在项目的__init__.py中,有一个create_app()调用了register_dashapp()函数:

def create_app():
    log.debug('creating app')
    app = Flask(__name__)
    log.debug('loading conf')
    app.config.from_object(BaseConfig)
    log.debug('register extensions')
    register_extensions(app)
    log.debug('register blueprints')
    register_blueprints(app)
    log.debug('register dashapp')

    register_dashapps(app)
    return app


def register_dashapps(app):
    from app.shap_dashboard.base_layout import get_layout
    from app.shap_dashboard.base_callbacks import register_callbacks

    dash_app_config=DashAppConfigurations()
    for page_logical_name, config in dash_app_config.config.items():
        print(page_logical_name)

        dashapp1 = dash.Dash(__name__,
                             server=app,
                             url_base_pathname='/' + config['URL'] + '/',
                             assets_folder=get_root_path(__name__) + '/shap_dashboard/assets/',
                             # meta_tags=[meta_viewport],
                             suppress_callback_exceptions=False,
                             )


        with app.app_context():
            dashapp1.title = page_logical_name

            dashapp1.layout = get_layout()
            register_callbacks(dashapp1, config)

函数register_dashapps调用get_layout(),该函数依赖于对数据库的某些查询:

def get_layout():
    html.Div([x.name for x in db.session.query(Players).all()])

表结构在model.py文件中定义:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Players(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True, unique=True)
    number = db.Column(db.Integer)
    role = db.Column(db.String(128))

我需要在玩家表中添加一列(即编辑Players类,然后运行flask db migrateflask db upgrade)。在此配置中,该过程将失败,因为get_layout中的数据库查询将失败。的确,如果我修改类Players,将无法再创建Flask应用。

解决方法:

  1. register_dashapps(app)中评论create_app()。这样,我就可以返回没有Dash的Flask应用程序
  2. 通过运行flask db migrateflask db upgrade
  3. 修改数据库
  4. 取消注释register_dashapps(app)并运行应用程序

另一种可能的解决方案是在try/except函数内添加register_dashapp。但是我觉得这不是最好的解决方案。

也许最好的解决方案是仅在flask cli命令为register_dashapp()时运行方法flask run。是否可以编辑Flask cli的运行命令?

0 个答案:

没有答案