Plotly dash Plotly Dash-dcc.存储回调触发两次
我对Plotly Dash有一个问题,即由dcc.Store组件触发的回调每次触发两次。请参阅下面的代码和示例输出代码,它基于Dash docs()中的示例 有人能解释这一点或建议一种解决方法来防止它吗 最小工作示例代码: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
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进行了测试)让我们继续找出发生了什么,但这也没有帮助。还是有重复的。可能是一个破折号错误?你的内存存储是否在会话中@疯狂的