Обновить состояние приложения за пределами обратного вызова в plotly dash

Я пишу сюжетное приложение Dash, в котором у меня изначально нет доступа к базе данных, поэтому мне нужно дождаться подключения к базе данных, прежде чем я смогу установить начальное состояние приложения.

Таким образом, я хочу запустить функцию, которая позже установит состояние приложения, но, похоже, единственный способ установить состояние - использовать декораторы @app.callback(), но проблема в том, что они требуют, чтобы свойство или переменная состояния наблюдались перед запуском, но в моем случай я не смотрю часть приложения Dash, я смотрю что-то внешнее.

Как я могу это сделать в Dash?

Например:

app = Dash(routes_pathname_prefix='/dash/trend/')

app.layout = html.Div(children=[
    dcc.Dropdown(
        options=get_field_options(),
        id='field_select',
        multi=True,
    )
])

@app.callback(
    dash.dependencies.Output('field_select', 'options'),
    [
         # What do I put here as an input??
    ]
)
def update_fields(href):
    return get_field_options()

person Migwell    schedule 24.05.2019    source источник


Ответы (2)


Вы можете использовать компонент хранилища графиков, чтобы хранить некоторые данные, необходимые для события.

dcc.Store(id='local', storage_type='local'),

компонент Dash Store

person Dimuthu    schedule 19.06.2019

Используйте скрытый html.Div() для хранения вашей информации. Это может быть пусто:

html.Div(id='application-state', style={'display': 'none'})

Итак, ваш код должен выглядеть так:

import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output

app = Dash(routes_pathname_prefix='/dash/trend/')

app.layout = html.Div(children=[
    dcc.Dropdown(
        options=get_field_options(),
        id='field_select',
        multi=True,
    ),
    html.Div(id='application-state', style={'display': 'none'})

])

@app.callback(
    [Output('field_select', 'options')],
    [Input('application-state', 'children')])
def update_fields(href):
    if href =! None:
       return get_field_options()
    else:
       return []

Ваш external part должен обновить соответствующий скрытый div. Вы можете изменить это на любой другой компонент, который может хранить информацию, которую вы хотите передать в визуализацию тире. Лучшие источники и приемы для этой проблемной области вы найдете здесь.

Часть if else для возврата действительного объекта немного сложна. Пожалуйста, дайте мне знать, если есть ошибка вывода обратного вызова, например Expected 1 output but received None или что-то подобное.

person Mike_H    schedule 24.05.2019
comment
Хм, но как мой внешний хук может обновить скрытый Div без использования обратного вызова Dash? И тогда ему все равно понадобится ввод. Можете ли вы показать, что состояние приложения обновляется в ответ на внешний триггер? - person Migwell; 27.05.2019
comment
Возможно, потоковые компоненты - ваше решение. - person Mike_H; 27.05.2019