为了账号安全,请及时绑定邮箱和手机立即绑定

Plotly dash 在重新加载时刷新全局数据

Plotly dash 在重新加载时刷新全局数据

守候你守候我 2023-04-25 15:45:40
假设我有一个dash应用程序,我希望全局数据在页面重新加载时刷新。我正在使用一个函数来提供这里描述的布局。但是,我注意到我应该如何/在哪里定义df这样我可以在回调中使用它(比如在我想根据df某些输入对 进行子集化并将其传递给布局表的情况下)。我下面的代码在页面刷新时重新加载数据,但回调无法访问df.我很陌生,dash所以提前为潜在的愚蠢问题道歉。def serve_layout():    df = # Fetch data from DB        return # Layoutapp.layout = serve_layout@app.callback()def my_func:    # Here I want to reference df
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

在回调之间共享数据的最常见方法是将数据保存在一个dash_core_components.Store对象中,


def serve_layout():

    df = # Fetch data from DB

    store = Store(id="mystore", data=df.to_json())  # The store must be added to the layout

    return # Layout 

然后,您可以将商店添加为State需要访问数据的回调的参数,


@app.callback(..., [State("mystore", "data")])

def my_func(..., data):

    df = pd.read_json(data)

这种方法的主要缺点是每次调用回调时都会在客户端和服务器之间交换数据。如果数据框很小,这并不重要,但如果它很大,数据交换(以及到/从 JSON 的序列化)可能会导致严重的性能问题。可以通过缓存数据框服务器端来避免这种情况,可以手动如文档中所示,也可以使用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"),  # this is the store that holds the data

                       html.Div(id="onload"),  # this div is used to trigger the query_df function on page load

                       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"])  # some random example data



@app.callback(Output("log", "children"), Input("store", "data"))

def print_df(df):

    return df.to_json()  # do something with the data



if __name__ == '__main__':

    app.run_server()

测试过dash-extensions==0.0.27rc1。免责声明:我是dash-extensions.


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信