Mad*_*Mad 5 python plotly-dash
我在使用 Plotly Dash 时遇到问题,组件触发的回调dcc.Store每次都会触发两次。请参阅下面的代码和示例输出代码,该代码基于 Dash 文档中的示例 ( 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)
Run Code Online (Sandbox Code Playgroud)
输出示例:
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)
Run Code Online (Sandbox Code Playgroud)
我建议将内存存储转换为session并将第二个回调中的代码更改为以下内容:
def on_data(ts, data):
if not data or not ts:
raise PreventUpdate
...
Run Code Online (Sandbox Code Playgroud)
这应该可以解决前几个循环回调的问题。
| 归档时间: |
|
| 查看次数: |
2960 次 |
| 最近记录: |