使用应用程序工厂模式时,如何从嵌入式Dash应用程序中访问Flask应用程序的上下文?

片松

我正在使用Flask和Dash构建Web应用程序。Flask主应用处理用户登录和身份验证,并保护Dash应用的路由。Dash应用是从Flask应用中提供的。

Flask主应用程序是使用Flask Mega Tutorial示例(https://github.com/miguelgrinberg/microblog构建的,具有应用程序工厂模式。我删除了除登录/身份验证之外的所有内容,并且该应用程序在该阶段运行良好。

然后,我按照以下示例在Flask应用程序中添加了一个简单的Dash应用程序:https : //github.com/okomarov/dash_on_flask可以在/ dashboard上访问Dash应用程序,并且该仪表板得到了适当的保护,可防止未经授权的访问,并按预期的那样重定向回Flask主页。

我现在面临的挑战是从Dash应用程序中访问Flask应用程序的上下文以及诸如数据库会话之类的其他内容。这样Dash应用程序可以访问和显示主数据库中的信息。

目前,我一直努力尝试遵循我在网上找到的示例,以及如何使它们适应我的应用程序的特定模式。

我尝试遵循链接到此处的示例:https : //github.com/plotly/dash/issues/214#issuecomment-391223557

但是,这些示例似乎全部基于平面应用程序结构,其中Flask和Dash应用程序在同一文件中创建。

我所有的代码都位于此处:https//github.com/danielcopelin/dacy-budget

此刻,我的主要Flask应用看起来像:

dacybudget.py

from app import create_app, db
from app.models import User

app = create_app()


@app.shell_context_processor
def make_shell_context():
    return {'db': db, 'User': User}

create_app()看起来像:

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    register_dashapps(app)

    db.init_app(app)
    migrate.init_app(app, db)
    login.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)

...和register_dashapps()看起来像:

def register_dashapps(app):
    from app.dashapp1.layout import layout
    from app.dashapp1.callbacks import register_callbacks

    # Meta tags for viewport responsiveness
    meta_viewport = {
        "name": "viewport",
        "content": "width=device-width, initial-scale=1, shrink-to-fit=no",
    }
    external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]
    dashapp1 = dash.Dash(
        __name__,
        server=app,
        url_base_pathname="/dashboard/",
        assets_folder=get_root_path(__name__) + "/dashboard/assets/",
        meta_tags=[meta_viewport],
        external_stylesheets=external_stylesheets,
    )

    dashapp1.title = "Dashapp 1"
    dashapp1.layout = layout
    dashapp1.url_base_pathname = "/dashboard/"  # I dont know why I had to do this
    register_callbacks(dashapp1)
    _protect_dashviews(dashapp1)

从app.dashapp1.layout和app.dashapp1.callbacks内部,我希望能够访问Flask应用程序的主会话和数据库等。

如果我尝试从app.dashapp1.layout中进行各种导入,例如“ from .. import db”,然后尝试对该数据库对象执行某些操作,则会收到类似以下错误:

RuntimeError:找不到应用程序。在视图函数内部工作或推送应用程序上下文。参见http://flask-sqlalchemy.pocoo.org/contexts/

有人可以就如何解决此问题提供任何建议吗?

片松

我设法解决了我的问题。我在努力了解该应用程序Dash端中可以访问Flask主应用程序上下文的位置,以便为Dash提供对数据库的访问。事实证明,可以在register_callbacks()函数以及在其中定义的实际回调函数中完成此操作,如下所示:

def register_callbacks(app):
    from app import db
    from app.models import Transaction
    ...

    @app.callback(
        Output("main", "children"),
        [Input("transaction_table", "data_previous")],
        [
            State("transaction_table", "data"),
            State("transaction_table", "page_current"),
        ],
    )
    def update_database_and_generate_table(old_table_data, table_data, page_current):
        with app.server.app_context():
            if old_table_data is not None:
                update_changed_data(old_table_data, table_data)
            transactions = db.session.query(Transaction)
            df = pd.read_sql(transactions.statement, transactions.session.bind)

为此,必须对我原始问题的代码进行另一处更改。create_app()功能中,您需要在数据库初始化后注册Dash应用程序:

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app)
    migrate.init_app(app, db)
    login.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)

    app = dashapp.add_dash(app)
    ...

完整的工作示例位于此处:https : //github.com/danielcopelin/dacy-budget

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从Flask应用程序中的外部应用程序上下文访问应用程序对象

如果使用应用程序工厂模式,如何在gunicorn中运行flask应用程序?

如何使用HTML中的嵌入式Java应用程序进行本地文件系统访问

在应用程序上下文之外工作-Flask

如何访问 ASP.NET Core 应用程序中的现有上下文?

如何从本机iOS应用程序控制嵌入式Unity应用程序

如何测试嵌入式红宝石应用程序?

如何从嵌入式应用程序接收 returnurl 事件?

如何从上下文中获取应用程序

Java Web应用程序中的嵌入式Derby

C ++应用程序中的嵌入式pdfium

应用程序菜单中 onOptionsItemSelected 的上下文

在活动中调用应用程序上下文

其余应用程序中的用户上下文

Android中的应用程序上下文

Spring应用程序中的根上下文路径

在各处使用应用程序上下文?

如何在 C# 应用程序内为 SoundPlayer 上下文使用来自程序集的嵌入文件

如何使用应用程序工厂模式访问 Flask 配置文件?

如何使用Spring Boot应用程序在嵌入式Jetty中配置异步超时

是否可以在Flask的Click CLI应用程序中使用“应用程序工厂”模式?

如何创建/查找应用程序jar以使用嵌入式tomcat部署Spring Boot Maven应用程序?

如何使用Koin DI将应用程序上下文从“应用程序”模块注入到“网络”模块

如何从Eclipse中的命令处理程序事件中找出应用程序上下文

Spring应用程序上下文:访问web.xml上下文参数?

从Spring安全性上下文访问应用程序上下文

春季:如何掌握Webapp和独立程序中的应用程序上下文

两个spring应用程序都使用特定的jar和应用程序上下文-如何控制从上下文从哪个应用程序中获取bean?

在Spring Boot应用程序中以嵌入式模式的SymmetricDS作为客户端