Plotly da sh обновление глобальных данных при перезагрузке - PullRequest
0 голосов
/ 03 августа 2020

Представьте, что у меня есть приложение dash, в котором я хочу, чтобы глобальные данные обновлялись sh при перезагрузке страницы. Я использую функцию для обслуживания макета, как описано здесь . Тем не менее, я уверен, как / где я должен определить df, чтобы я мог использовать его в обратных вызовах (например, в случае, когда я хотел бы подмножество df на основе некоторого ввода и передать его в макет стол). Мой код ниже перезагружает данные на странице refre sh, но обратный вызов не может получить доступ к df.

Я новичок в dash, поэтому заранее извиняюсь за потенциально глупый вопрос.

def serve_layout():
    df = # Fetch data from DB
    
    return # Layout

app.layout = serve_layout

@app.callback()
def my_func:
    # Here I want to reference df

1 Ответ

1 голос
/ 03 августа 2020

Наиболее распространенный подход к обмену данными между обратными вызовами - сохранить данные в объекте 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.

...