Postgres数据实时更新求助:Flask/Dash仪表板无法自动刷新
解决Flask仪表板需重启才能更新Postgres数据的问题
核心原因是数据查询逻辑只在Flask启动时执行了一次,后续请求复用了旧的DataFrame,没有重新拉取最新数据。以下是几种解决方法:
每次请求重新查询数据库
将数据查询代码移到视图函数内部,确保每次请求都从数据库获取最新数据:@app.route('/dashboard') def dashboard(): # 从配置文件读取数据库凭证 with open('pg_config.json') as f: pg_config = json.load(f) # 建立连接并查询 conn = psycopg2.connect(**pg_config) df = pd.read_sql_query("SELECT * FROM your_target_table", conn) conn.close() # 后续图表生成、模板渲染逻辑 return render_template('dashboard.html', df=df)使用数据库连接池优化性能
频繁创建数据库连接会影响性能,可通过连接池复用连接,以SQLAlchemy为例:from flask_sqlalchemy import SQLAlchemy import json app = Flask(__name__) # 从配置文件加载数据库连接信息 with open('pg_config.json') as f: pg_config = json.load(f) db_uri = f"postgresql://{pg_config['user']}:{pg_config['password']}@{pg_config['host']}:{pg_config['port']}/{pg_config['dbname']}" app.config['SQLALCHEMY_DATABASE_URI'] = db_uri db = SQLAlchemy(app) @app.route('/dashboard') def dashboard(): # 每次请求通过连接池获取连接查询数据 df = pd.read_sql_table('your_target_table', db.engine) # 处理数据并渲染 return render_template('dashboard.html', df=df)Dash集成场景:回调触发时重新查询
如果是Flask集成Dash的仪表板,确保回调函数每次触发都重新拉取数据:from dash import Dash, dcc, html, Input, Output, callback import psycopg2 import pandas as pd import plotly.express as px import json app = Flask(__name__) dash_app = Dash(server=app, url_base_pathname='/dashboard/') # 定义Dash布局 dash_app.layout = html.Div([ dcc.Interval(id='interval-component', interval=5*1000, n_intervals=0), dcc.Graph(id='update-chart') ]) @callback(Output('update-chart', 'figure'), Input('interval-component', 'n_intervals')) def update_graph(n): # 每次回调重新查询数据 with open('pg_config.json') as f: pg_config = json.load(f) conn = psycopg2.connect(**pg_config) df = pd.read_sql_query("SELECT * FROM your_target_table", conn) conn.close() # 生成最新图表 fig = px.line(df, x='date_col', y='value_col') return fig缓存机制调整(如果使用了缓存)
若用了flask-caching,需设置合理的缓存过期时间,或在数据变更时主动清除缓存:from flask_caching import Cache cache = Cache(app, config={'CACHE_TYPE': 'SimpleCache', 'CACHE_DEFAULT_TIMEOUT': 300}) @app.route('/dashboard') @cache.cached(timeout=300) # 设置5分钟自动过期 def dashboard(): # 查询数据逻辑 ...
内容的提问来源于stack exchange,提问作者Elias Coutinho
相关产品推荐
相关产品推荐

