如何将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方案参考(不推荐生产使用)
如果仅做功能测试可以尝试:
- 首先给Flask实例配置SecretKey:
server.secret_key = "你自己的随机密钥字符串" - 在
post_data路由中存入Session:flask.session['sensor_data'] = new_data - 在Dash回调中直接读取:
data = flask.session.get('sensor_data', [])
内容的提问来源于stack exchange,提问作者user11696358
相关产品推荐
相关产品推荐

