Plotly dash Plotly Dash-dcc.存储回调触发两次

Plotly dash Plotly Dash-dcc.存储回调触发两次,plotly-dash,Plotly Dash,我对Plotly Dash有一个问题,即由dcc.Store组件触发的回调每次触发两次。请参阅下面的代码和示例输出代码,它基于Dash docs()中的示例 有人能解释这一点或建议一种解决方法来防止它吗 最小工作示例代码: import dash import dash_html_components as html import dash_core_components as dcc from dash.dependencies import Output, Input, State fro

我对Plotly Dash有一个问题,即由dcc.Store组件触发的回调每次触发两次。请参阅下面的代码和示例输出代码,它基于Dash docs()中的示例

有人能解释这一点或建议一种解决方法来防止它吗

最小工作示例代码:

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})

我建议将内存存储转换为
session
,并将第二个回调中的代码更改为以下内容:

def on_data(ts, data):

    if not data or not ts:
        raise PreventUpdate

    ...

这应该可以解决前几个循环回调中的一些问题。

。我的第一个想法是从app.run\u server行中删除threading命令——这可能会导致重复记录。谢谢。我试过了,但没用。你能重现这个问题吗?我没有重复的日志。。。奇怪的数据如何存储在dcc对象中?如果您从
local
更改为
session
–该怎么办?您使用的是什么版本的Dash?回调逻辑在版本1.11.0中发生了重大更改,因此更新到此版本可能会解决您的问题。@blong感谢您的建议。我正在做更多的测试来确认。不幸的是,这个错误并没有在原始代码中出现,也就是说,保留了
threaded=True
(针对破折号==1.18.1、1.17.0和1.11.0进行了测试)让我们继续找出发生了什么,但这也没有帮助。还是有重复的。可能是一个破折号错误?你的内存存储是否在会话中@疯狂的