gpt4 book ai didi

python-3.x - 使用应用工厂模式时,如何从嵌入式 Dash 应用中访问 Flask 应用的上下文?

转载 作者:行者123 更新时间:2023-12-03 15:54:56 25 4
gpt4 key购买 nike

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

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

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

我现在面临的挑战是从 Dash 应用程序中访问 Flask 应用程序的上下文和其他内容,例如数据库 session 。这样 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 应用程序的 session 和数据库等。

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

运行时错误:找不到应用程序。在 View 函数内工作或推送应用程序上下文。见 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

关于python-3.x - 使用应用工厂模式时,如何从嵌入式 Dash 应用中访问 Flask 应用的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56754167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com