Plotly Da sh - d cc .Store обратного вызова стрельбы дважды - PullRequest
2 голосов
/ 12 марта 2020

У меня возникла проблема с Plotly Da sh, из-за которой обратный вызов, запускаемый рекламой cc .Store, запускается дважды каждый раз. См. Приведенный ниже код и пример выходного кода, который основан на примере в документации Da sh (https://dash.plot.ly/dash-core-components/store).

Может кто-нибудь объяснить это или предложить обходной путь для предотвращения это?

Минимальный рабочий пример кода:

import dash

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

app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Store(id='local', storage_type='local'),
    html.Div(html.Button('localStorage', id='local-button')),
    html.Div(0, id='local-clicks'),
])


@app.callback(Output('local', 'data'),
              [Input('local-button', 'n_clicks')],
              [State('local', 'data')])
def on_click(n_clicks, data):
    if n_clicks is None:
        raise PreventUpdate

    app.logger.info(f"Updating data store")

    data = data or {'clicks': 0}

    data['clicks'] = data['clicks'] + 1
    return data


@app.callback(Output('local-clicks', 'children'),
              [Input('local', 'modified_timestamp')],
              [State('local', 'data')]
              )
def on_data(ts, data):
    if ts is None:
        raise PreventUpdate

    app.logger.info(f"New data found! ({ts}, {data})")

    return f"{ts}, {data['clicks']}"


if __name__ == '__main__':
    app.run_server(debug=True, port=8077, threaded=True)

Пример вывода:

Running on http://127.0.0.1:8077/
Debugger PIN: 597-637-135
New data found! (1584011957193, {'clicks': 24})
New data found! (1584011957193, {'clicks': 24})
Updating data store
New data found! (1584012443177, {'clicks': 25})
New data found! (1584012443177, {'clicks': 25})
Updating data store
New data found! (1584012445159, {'clicks': 26})
New data found! (1584012445159, {'clicks': 26})

1 Ответ

0 голосов
/ 13 марта 2020

Я бы предложил преобразовать хранилище памяти в session и изменить код во втором обратном вызове на следующее:

def on_data(ts, data):

    if not data or not ts:
        raise PreventUpdate

    ...

Это должно разрешить некоторые из первых нескольких циклических обратных вызовов.

...