如何使用Dash加载具有相同输入的单独查询



我正在尝试构建Dash仪表板。我想显示一个DataTable,并为此从两个源获取数据。第一个查询很慢,所以我只想在其中一个输入更改时执行,而另一个查询我想连续运行。

我曾尝试将它们拆分为两个具有类似输入的独立回调,但失败了。我认为这是由于第二个回调已经在执行,并且还没有第一个回调的输入,但不确定如何执行。我已经尝试创建了一个Store模块来在中执行此操作。

非常感谢您的帮助。

app = Dash(__name__)
app.index_string = layout.index_string
app.layout = layout.Column([
layout.Row([
layout.Column([
html.Label("Input"),
dcc.Input(id='user-input', value='ABC'),
]),
], padding=2),
dash_table.DataTable(id='grid'),
dcc.Store(id='heavy-data'),
dcc.Interval(id='interval', interval=50_000)
])

@app.callback(
Input('user-input', 'value'),
Output('heavy-data', 'data'))
def get_heavy_data(user_input):
heavy_data = create_heavy_data(user_input)
return heavy_data.to_json(date_format='iso', orient='split')

@app.callback(
Output('grid', 'data'),
Output('grid', 'columns'),
Input('heavy-data', 'data'),
Input('user-input', 'value'),
Trigger('interval', 'n_intervals'))
def get_all_data(heavy_data, user_input):
light_data = create_light_data(user_input)
data = light_data.merge(heavy_data, how='left')
return [
data.to_dict('records'),
[{'id': i} for i in data.columns]
]

if __name__ == '__main__':
app.run_server(debug=False)

如果我正确理解您的情况,我认为最好通过一个回调来处理这种情况,该回调根据用户修改的组件执行不同的操作。我将完全删除第一个回调,并用遵循此模式的回调替换第二个回调。

我将dcc.Store("heavy-data").data从Input更改为State,以防止新更新的数据通过回调触发第二次不必要的跳闸。

@app.callback(
Output('grid', 'data'),
Output('grid', 'columns'),
Output('heavy-data', 'data'),  # <--- Add Here/Combine to single callback
Input('user-input', 'value'),
Input('interval', 'n_intervals'),
State('heavy-data', 'data'),  # State allows you to use the data without an update to it re-triggering this callback
)
def get_all_data(user_input, n_intervals, heavy_data):
trigger_component_id = dash.callback_context.triggered[0]["prop_id"].split(".")[0]
if trigger_component_id == 'user-input':  # only create new heavy data if user-input triggers the callback
heavy_data = create_heavy_data(user_input)
light_data = create_light_data(user_input)
data = light_data.merge(heavy_data, how='left')
return [
data.to_dict('records'),
[{'id': i} for i in data.columns],
heavy_data
]

最新更新