未注册的多页 Dash 应用回调

Sco*_*ott 5 python flask plotly-dash

我正在开发我的第一个 Dash 应用程序(我在 Django 方面有经验,在 Flask 方面的经验很少,我知道 Dash 是建立在 Flask 上的),但是我在路由和注册新页面的回调时遇到了问题。我已经阅读了一些关于该主题的文章,例如:https : //dash.plot.ly/urls

目前我有我的主要 app.py:

from app1 import build as app1

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
server = app.server
app.config.suppress_callback_exceptions = True


body = html.Div([
    dcc.Location(id='url', refresh=False),
    html.Div(id='page-content')
], id='body')

app.layout = html.Div([navbar, body])


@app.callback(dash.dependencies.Output('page-content', 'children'),
              [dash.dependencies.Input('url', 'pathname')])
def display_page(pathname):
    if pathname == '/' or pathname == '' or pathname == '/index':
        return build_index_page()
    elif pathname == '/1':
        return app1.layout
    else:
        return html.H3('URL Error!')


if __name__ == '__main__':
    app.run_server(debug=True)
Run Code Online (Sandbox Code Playgroud)

然后我想构建将加载到“html.Div(id='page-content')”中的子应用程序/图形

App1 是它自己的子目录,包含 init.py 和 build.py,其中 build 将生成要加载的布局和回调。构建.py:

from app import app

#layout = build_body()
# initialize_callbacks(app)

layout = html.Div([
    html.H3('App 1'),
    dcc.Dropdown(
        id='app-1-dropdown',
        options=[
            {'label': 'App 1 - {}'.format(i), 'value': i} for i in [
                'NYC', 'MTL', 'LA'
            ]
        ]
    ),
    html.Div(id='app-1-display-value')
])


@app.callback(
    Output('app-1-display-value', 'children'),
    [Input('app-1-dropdown', 'value')])
def display_value(value):
    return 'You have selected "{}"'.format(value)
Run Code Online (Sandbox Code Playgroud)

最终我想制作另外 2 个文件,一个包含布局,一个包含回调。你可以看到我的原始实现被注释掉了,但是当它不起作用时我只是将代码移到 build.py 中。(该功能直接取自上面链接的 Dash 示例。)

当我转到我的第二页时,内容加载正常但回调没有,因此从下拉列表中选择一个项目不会按预期填充 div。它也应该在加载时触发以显示初始值,但它也没有这样做。

任何帮助将不胜感激!谢谢!

Sco*_*ott 4

我明白了,但我不确定“为什么”

如果我将 app.py 编辑为:

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
server = app.server
app.config.suppress_callback_exceptions = True
Run Code Online (Sandbox Code Playgroud)

并创建index.py为:

from app1 import build as app1
from app import app


body = html.Div([
    dcc.Location(id='url', refresh=False),
    html.Div(id='page-content')
], id='body')

app.layout = html.Div([navbar, body])


@app.callback(dash.dependencies.Output('page-content', 'children'),
              [dash.dependencies.Input('url', 'pathname')])
def display_page(pathname):
    if pathname == '/' or pathname == '' or pathname == '/index':
        return build_index_page()
    elif pathname == '/1':
        return app1.layout
    else:
        return html.H3('URL Error!')


if __name__ == '__main__':
    app.run_server(debug=True)
Run Code Online (Sandbox Code Playgroud)

然后 build.py 的代码就可以工作了!正如我所说,我不确定为什么会出现这种情况......