最常见的在回调之间共享数据的方法是将数据保存在
dash_core_components.Store
对象中。
def serve_layout():
df =
store = Store(id="mystore", data=df.to_json())
return
您可以将该存储库作为
State
参数添加到需要访问数据的回调函数中。
@app.callback(..., [State("mystore", "data")])
def my_func(..., data):
df = pd.read_json(data)
这种方法的主要缺点是每次调用回调时客户端和服务器之间都会交换数据。如果数据帧很小,那么这并不重要,但如果它很大,数据交换(以及序列化/反序列化为JSON)可能会导致严重的性能问题。可以通过在服务器端手动缓存数据帧(如
documentation中所示)或使用
dash-extensions
提供的增强组件来避免这种情况。以下是后者的一个小例子。
import dash_core_components as dcc
import dash_html_components as html
import numpy as np
import pandas as pd
from dash_extensions.enrich import Dash, ServersideOutput, Output, Input, Trigger
app = Dash()
app.layout = html.Div([dcc.Store(id="store"),
html.Div(id="onload"),
html.Div(id="log")])
@app.callback(ServersideOutput("store", "data"), Trigger("onload", "children"))
def query_df():
return pd.DataFrame(data=np.random.rand(int(10)), columns=["rnd"])
@app.callback(Output("log", "children"), Input("store", "data"))
def print_df(df):
return df.to_json()
if __name__ == '__main__':
app.run_server()
使用dash-extensions==0.0.27rc1
进行测试。免责声明:我是dash-extensions
的作者。