繁体   English   中英

当我访问 Python Dash 中的数据库时,dcc.store 值未更新

[英]dcc.store value not updating when i access the database in Python Dash

我一直在尝试使用 Python Dash 创建一个仪表板。 仪表板每 5 秒尝试访问数据库并尝试更新图表。 第一次从数据库中获取值后,我尝试使用格式中的 dataframe 的值更新商店。

| 日期 | 计数 |

| ----- | ------ |

| 01-01-2022 | 55 |

| 02-01-2022 | 45 |

我尝试将计数保存为列表 [55, 45]。 然后每隔 5 秒,我再次获取数据并使用 [55、45、65、30 ....] 等新值扩展数组。 但是,dcc.store 不保存该值,而是在每次更新后作为 dcc.store 的初始值出现。



from dash import Dash, html, dcc, Input, Output, State
import plotly.express as px
import dash
import time
import random
import pandas as pd
import numpy as np
import json
import asyncio
from bson import ObjectId
from pathlib import Path
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
from dash.exceptions import PreventUpdate

from get_data import init


# DASH APP
app = Dash(__name__)

# Interval in milliseconds
interval = 5000



app.layout = html.Div(
    children=[ html.H1(children="Time Series Reach Analysis"), 
               html.P(children="Time Series Dataset from August 2021 to October 2022"),
               html.Div(id="timeseries-graph", children=[]),
               html.Div(id="interval-counter", children=[]),
               dcc.Store(id='df-storage', data=[], storage_type="memory"),
               dcc.Interval(id='interval-time', interval=interval, n_intervals=0)
                ],
    style={ "text-align" : "center" } 

               
)




@app.callback(
    # Returned Values
    Output("df-storage", "data"),
    Output("interval-counter", "children"),
    
    # Parameters
    Input("interval-time", "n_intervals"),
    State("df-storage", "data")
)
def refresh_graph(n_intervals, data):
    storage_value = []
    if n_intervals == 0:
       

        fetched_df = init()   

        print("0 - Df = ", fetched_df)

        data.extend(fetched_df["_id"].tolist())

        print(f"00 - Values for n_intervals-{n_intervals} and data-{data}")

        return data , f"Intervals : {n_intervals}"
        
    else:
     

        fetched_df = init()    


        data.extend(fetched_df["_id"].tolist())
    
        return  data , f"Intervals : {n_intervals}"


@app.callback( 
    Output("timeseries-graph", "children"),  
    Input("df-storage", "data"),

 )
def create_graph(data):
  
    df = pd.DataFrame(data=data, columns=["_id"])
    fig = px.line( df, y="_id", x=df.index.tolist() )
    return dcc.Graph(figure=fig)




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

init() function只是简单的从mongodb中取出数据,转换成时间戳和计数的dataframe。 但是,当我尝试在不从数据库中获取数据的情况下做同样的事情时,同样的代码会完全按照它应该的方式运行。

我尝试了相同的代码,但没有使用 random.random() function 获取数据,并且在每 5 秒间隔后向“数据”列表添加新值。 然后它像人们预期的那样工作。 如果有任何帮助,我将不胜感激!

所以我找到了答案。

它无法与数据库调用一起正常工作的原因是,数据库调用花费的时间比我的间隔时间长。

因此,当 5 秒间隔过去时,Dash 将更新 n_interval 计数。 导致启动另一个调用,这将导致另一个数据库调用,而之前的数据库调用仍处于挂起状态。

我通过延长间隔时间解决了这个问题。 这将有助于在下一次间隔更新发生之前完成数据库调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM