You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flask路由接收的数据共享给Dash回调使用

方案说明

首先明确:不建议将传感器数据存储在Flask Session中,原因如下:

  • 默认Flask Session是存储在客户端Cookie中的,单条Cookie最大仅支持4KB存储,无法承载时间序列类的传感器数据
  • Session是用户隔离的,传感器上传的公共数据存储在每个独立用户的Session中会导致数据重复、新用户无法获取历史数据等问题
  • 多进程部署场景下,即使使用服务端Session也需要额外做共享适配,成本过高

最优实现方案

根据部署场景不同选择对应存储方案,再搭配Dash的定时触发组件实现自动更新:

1. 单进程测试场景(仅本地调试用)

直接用全局变量做共享存储即可,实现最简单:

import dash
from dash import dcc, Input, Output
import plotly.express as px
import flask
import json

# 全局存储传感器数据
sensor_data = []

app = dash.Dash(__name__)
app.layout = [
    # 你的下拉选择框等组件
    dcc.Dropdown(id='mydropdown1', options=['x', 'y', 'value'], value='x'),
    # 定时触发组件,1000ms=1秒触发一次回调,实现自动更新
    dcc.Interval(id='update_interval', interval=1000, n_intervals=0),
    dcc.Graph(id='mygraph'),
]
server = app.server
# 注意不要用eval接收数据,安全风险极高,改用json解析
@server.route('/post_data', methods=['POST'])
def post_data():
    global sensor_data
    if flask.request.method == 'POST':
        # 要求传感器端传标准JSON格式,替换原来的eval
        new_data = json.loads(flask.request.data.decode('utf8'))
        sensor_data.append(new_data)
        return "success"

@app.callback(
    Output('mygraph', 'figure'),
    Input('mydropdown1', 'value'),
    # 加入定时触发器作为输入,每次计数变化就触发更新
    Input('update_interval', 'n_intervals')
)
def update_mygraph(dropdown_val, _):
    # 直接读取全局存储的传感器数据即可
    fig = px.scatter(sensor_data, x="x", y=dropdown_val)
    return fig

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

2. 生产多进程部署场景

用Redis做共享存储即可,只要保证所有Flask/Dash进程连接同一个Redis实例就能实现数据共享,操作和全局变量几乎一致,只需要把数据读写换成Redis的存/取命令即可。

Session方案参考(不推荐生产使用)

如果仅做功能测试可以尝试:

  1. 首先给Flask实例配置SecretKey:server.secret_key = "你自己的随机密钥字符串"
  2. 在post_data路由中存入Session:flask.session['sensor_data'] = new_data
  3. 在Dash回调中直接读取:data = flask.session.get('sensor_data', [])

内容的提问来源于stack exchange,提问作者user11696358

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:42:03