Многостраничные обратные вызовы приложения Da sh не регистрируются - PullRequest
1 голос
/ 25 января 2020

Я работаю над своим первым приложением Da sh (у меня есть опыт в Django и очень мало в Flask, на котором я знаю, что Da sh построен), но у меня проблемы с маршрутизацией и регистрация обратных вызовов для новых страниц. Я прочитал несколько статей на эту тему, таких как: 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)

А потом я хотел бы для создания вложенных приложений / графиков, которые будут загружены в «html .Div (id = 'page-content')» *

App1 - это собственный вспомогательный каталог с init.py и build.py где build сгенерирует макет и обратные вызовы для загрузки. 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)

В конце концов я хотел бы сделать еще 2 файла, один для размещения макета и один для обратных вызовов. Вы можете видеть, что моя оригинальная реализация закомментирована, но я просто переместил код в build.py, когда он не работал. (Функциональность была взята непосредственно из примера Da sh, указанного выше.)

Когда я go захожу на мою вторую страницу, контент загружается нормально, но обратный вызов - нет, поэтому выбор элемента из выпадающего списка down не заполняет div так, как это должно быть. Предполагается, что он также запускается при загрузке, чтобы показать начальное значение, но он также не делает этого.

Любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

1 голос
/ 25 января 2020

Я понял это, но я не уверен насчет "почему"

Если я отредактирую app.py так:

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

и создаю 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)

Тогда код для build.py работает! Как я уже сказал, я не уверен, почему это так ...

...