首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用应用工厂模式时,如何从嵌入式Dash应用中访问Flask应用的上下文?

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

Stack Overflow用户
提问于 2019-06-25 20:33:17
回答 2查看 2.5K关注 0票数 6

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

主要的Flask应用程序是使用Flask Mega教程示例(https://github.com/miguelgrinberg/microblog)和应用程序工厂模式构建的。我剔除了除了登录/身份验证之外的所有东西,这个应用程序在那个阶段运行得很好。

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

我现在面临的挑战是从Dash应用程序中访问Flask应用程序的上下文和其他内容,比如数据库会话。这是为了让Dash应用程序能够访问和显示主数据库中的信息。

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

我尝试了这里链接的例子:https://github.com/plotly/dash/issues/214#issuecomment-391223557

然而,这些示例似乎都是基于扁平化的应用程序结构,其中Flask和Dash应用程序是在同一文件中创建的。

我的所有代码都位于以下位置:https://github.com/danielcopelin/dacy-budget

目前,我的主要Flask应用程序如下所示:

dacybudget.py

代码语言:javascript
复制
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()看起来像这样:

代码语言:javascript
复制
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()看起来像这样:

代码语言:javascript
复制
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.dasapp1.layout和app.dasapp1.callback中,我希望能够访问主Flask应用程序的会话和数据库等。

如果我尝试从app.dasapp1.layout中进行各种导入,例如"from ..import db“,然后尝试对db对象执行某些操作,则会得到如下错误:

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

有没有人能就如何解决这个问题提供一些建议?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-27 07:40:30

我设法解决了我的问题。我很难理解在应用程序的Dash端哪里可以访问主Flask应用程序的上下文,这样我就可以为Dash提供对数据库的访问。事实证明,这可以在register_callbacks()函数和其中定义的实际回调函数中完成,如下所示:

代码语言:javascript
复制
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应用程序:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2020-02-25 06:58:19

你的答案在这里,Project Layout。我遇到了类似的问题,无法在flask应用程序中进行“正常”的python导入。

按照建议将你的应用命名为flaskr,并将app.py和模板移动到那里……就像在教程中一样。这对我很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56754167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档