翼度科技»论坛 云主机 LINUX 查看内容

Flask SocketIO 实现动态绘图

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
Flask-SocketIO 是基于 Flask 的一个扩展,用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议,常用于实现实时性要求较高的应用,如聊天应用、实时通知等,使得开发者可以更轻松地构建实时性要求较高的应用。通过定义事件处理函数,可以实现双向实时通信,为应用提供更加丰富和实时的用户体验。
前端参数拼接

Flask 提供了针对WebSocket的支持插件flask_socketio直接通过pip命令安装即可导入使用,同时前端也需要引入SocketIO.js库文件。
如下代码通过ECharts图表库和WebSocket技术实现了一个实时监控主机CPU负载的动态折线图。通过WebSocket连接到Flask应用中的Socket.IO命名空间,前端通过实时接收后端传来的CPU负载数据,动态更新折线图,展示1分钟、5分钟和15分钟的CPU负载趋势。同时,通过控制台打印实时数据,实现了方便的调试和监控功能。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.    
  6.    
  7.    
  8. </head>
  9. <body>
  10.    
  11.    
  12.    
  13.    
  14.    
  15.    
  16. </body>
  17. </html>
复制代码
后台代码使用Flask和Flask-SocketIO搭建了一个实时监控主机CPU负载的WebSocket应用,并将数据通过socketio.emit函数将数据推送给前端展示。
关键点概括如下:
Flask和SocketIO集成:

  • 使用Flask框架创建了一个Web应用,并通过Flask-SocketIO集成了WebSocket功能,实现了实时双向通信。
消息接收与实时推送:

  • 定义了socket事件处理函数,用于接收前端通过WebSocket发送的消息。在无限循环中,通过socketio.sleep方法设置每2秒推送一次实时的CPU负载数据给前端。
前端连接和断开事件:

  • 定义了connect和disconnect事件处理函数,分别在WebSocket连接建立和断开时触发。在控制台打印相应信息,用于监控连接状态。
实时数据推送:

  • 使用socketio.emit方法实时将CPU负载数据推送给前端,以更新折线图。推送的数据包括当前时间、1分钟负载、5分钟负载和15分钟负载。
前端页面渲染:

  • 通过Flask的render_template方法渲染了一个HTML页面,用于展示实时更新的CPU负载折线图。
调试信息输出:

  • 在每个事件处理函数中使用print语句输出调试信息,方便监测WebSocket连接和消息的传递过程。
总体来说,该应用实现了一个简单而实用的实时监控系统,通过WebSocket技术实时推送主机CPU负载数据至前端,为用户提供了实时可视化的监控体验。
  1. from flask import Flask,render_template,request
  2. from flask_socketio import SocketIO
  3. import time,psutil
  4. async_mode = None
  5. app = Flask(__name__)
  6. app.config['SECRET_KEY'] = "lyshark"
  7. socketio = SocketIO(app)
  8. @app.route("/")
  9. def index():
  10.     return render_template("index.html")
  11. # 出现消息后,率先执行此处
  12. @socketio.on("message",namespace="/Socket")
  13. def socket(message):
  14.     print("接收到消息:",message['data'])
  15.     while True:
  16.         socketio.sleep(2)
  17.         data = time.strftime("%M:%S",time.localtime())
  18.         cpu = psutil.cpu_percent(interval=None,percpu=True)
  19.         socketio.emit("response",
  20.                       {"datetime": data, "load1": cpu[0], "load5": cpu[1], "load15": cpu[2]},
  21.                       namespace="/Socket")
  22. # 当websocket连接成功时,自动触发connect默认方法
  23. @socketio.on("connect",namespace="/Socket")
  24. def connect():
  25.     print("链接建立成功..")
  26. # 当websocket连接失败时,自动触发disconnect默认方法
  27. @socketio.on("disconnect",namespace="/Socket")
  28. def disconnect():
  29.     print("链接建立失败..")
  30. if __name__ == '__main__':
  31.     socketio.run(app,debug=True)
复制代码
运行后,即可输出当前系统下CPU的负载情况,如下图所示;

后端参数拼接

如上所示的代码是在前端进行的数据拼接,如果我们想要在后端进行数据的拼接,则需要对代码进行一定的改进。
前端编写以下代码,通过WebSocket建立通信隧道,而后台则每隔2秒向前台推送传递字典数据。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.    
  6.    
  7.    
  8. </head>
  9. <body>
  10.    
  11.    
  12.    
  13.    
  14. </body>
  15. </html>
复制代码
后台代码则是收集数据,并将数据通过socketio.emit函数,推送给前端。
  1. from flask import Flask,render_template,request
  2. from flask_socketio import SocketIO
  3. import time,psutil
  4. async_mode = None
  5. app = Flask(__name__)
  6. app.config['SECRET_KEY'] = "lyshark"
  7. socketio = SocketIO(app)
  8. # 填充数据表
  9. local_time = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
  10. cpu_load1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  11. cpu_load5 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  12. cpu_load15 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  13. # 左移填充
  14. def shift(Array, Size, Push):
  15.     if len(Array) <= Size and len(Array) >= 0:
  16.         Array.pop(0)
  17.         Array.append(Push)
  18.         return True
  19.     return False
  20. # 右移填充
  21. def unshift(Array, Size, Push):
  22.     if len(Array) <= Size and len(Array) >= 0:
  23.         Array.pop(Size-1)
  24.         Array.insert(0,Push)
  25. @app.route("/")
  26. def index():
  27.     return render_template("index.html")
  28. # 出现消息后,率先执行此处
  29. @socketio.on("message",namespace="/Socket")
  30. def socket(message):
  31.     print("接收到消息:",message['data'])
  32.     while True:
  33.         socketio.sleep(1)
  34.         data = time.strftime("%M:%S",time.localtime())
  35.         cpu = psutil.cpu_percent(interval=None,percpu=True)
  36.         # 实现数组最大35,每次左移覆盖第一个
  37.         shift(local_time,35,data)
  38.         shift(cpu_load1,35,cpu[0])
  39.         shift(cpu_load5, 35, cpu[1])
  40.         shift(cpu_load15, 35, cpu[2])
  41.         socketio.emit("response",
  42.                       {"datetime": local_time, "load1": cpu_load1, "load5": cpu_load5, "load15": cpu_load15},
  43.                       namespace="/Socket")
  44. # 当websocket连接成功时,自动触发connect默认方法
  45. @socketio.on("connect",namespace="/Socket")
  46. def connect():
  47.     print("链接建立成功..")
  48. # 当websocket连接失败时,自动触发disconnect默认方法
  49. @socketio.on("disconnect",namespace="/Socket")
  50. def disconnect():
  51.     print("链接建立失败..")
  52. if __name__ == '__main__':
  53.     socketio.run(app,debug=True)
复制代码
运行动态图如下所示;


来源:https://www.cnblogs.com/LyShark/p/17860158.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具