Dash:跨页面具有相同数据的多页面应用程序

我的问题是,数据总共位于四个数据帧中,并且我的应用程序中的三个页面中的每一页都使用其中多个数据帧来可视化内容。我试图避免每次调用其中一个页面时都重新加载数据帧。这可能吗?如何?

目前,我尝试首先使用 index.py 中的函数加载 df,然后加载其他页面:

df_fz, df_md, df_auf, df_mat = get_dfs()

from apps import app1, app2, app3


[...]


@app.callback(Output('page-content', 'children'),

              [Input('url', 'pathname')])

def display_page(pathname):

    if pathname == '/app1':

        return app1.layout

    elif pathname == '/app2':

        return app2.layout

    else:

        return app3.layout

app1 到 app3 中的每一个都使用数据帧,就好像它们是在脚本顶部加载的一样,但此代码按原样抛出错误,因为 df 未定义。app3 的一个最小示例:


layout = html.Div([

    html.H3('App 3'),

    dcc.Dropdown(

        id='app-3-dropdown',

        options=[

            {'label': 'App 3 - {}'.format(i), 'value': i} for i in [df_fz.Value]

        ]

    ),

    html.Div(id='app-3-display-value'),

])


@app.callback(

    Output('app-3-display-value', 'children'),

    [Input('app-3-dropdown', 'value')])

def display_value(value):

    return 'You have selected "{}" but in App 3'.format(value)


喵喵时光机
浏览 190回答 3
3回答

宝慕林4294392

看起来您需要做的就是创建一个模块,其中包含可以在不同文件之间共享的数据。data.pyimport pandas as pd df1 = pd.DataFrame()app1.pyfrom data import df1app2.pyfrom data import df1模块变量是全局变量,因此所有文件都将共享相同的 df1,并且由于它是导入,因此它将在 app、app1 等中的其余代码之前运行。您还可以在开头保留 id='app-3-dropdown', options=[] ,然后创建选项列表作为 'app-3-dropdown' 的回调。您可以将数据帧存储在 dcc.Store(id='df-data', data=df.to_dict()) 中,并且可以用作其他回调的输入或状态。

富国沪深

尝试将数据帧放入数据集文件夹中,并将它们连接到每个应用程序页面中。像这样的东西:PATH = pathlib.Path(__file__).parent DATA_PATH = PATH.joinpath("../datasets").resolve() df = pd.read_csv(DATA_PATH.joinpath("mydata.csv"))

慕工程0101907

以下文件结构-- app.py - index.py - apps    |-- __init__.py    |-- app1.py    |-- app2.py尝试这种读取“app.py”文件中的数据帧的方法。由于每个“app1.py”、“app2.py”、“app3.py”都使用这些数据帧,因此请在这些文件中导入 df,即在“app1.py”代码中:from app import app from app import df_fz, df_md, df_auf, df_mat对于其他文件也是如此。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python