Flask 預設提供了針對WebSocket的支援插件from flask_socketio import SocketIO 直接通過pip指令安裝即可導入使用,前端也需要引入socketIO庫檔案,其網站首頁是:https://socket.io/
實作簡單的資料通信
建立index.html
<!--name:index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script>
<script type="text/javascript" src="http://cdn.bootcss.com/socket.io/1.7.0/socket.io.min.js"></script>
</head>
<body>
<script type="text/javascript" charset="UTF-8">
$(document).ready(function() {
namespace = '/Socket';
var socket = io.connect("http://" + document.domain + ":" + location.port + namespace);
socket.emit("message",{"data":"hello lyshark"}); // 初始化完成後,發送一條消息.
socket.on('response', function(recv) {
console.log(recv.Data)
});
});
</script>
</body>
</html>
app.py
# name: app.py
from flask import Flask,render_template,request
from flask_socketio import SocketIO
async_mode = None
app = Flask(__name__)
app.config['SECRET_KEY'] = "lyshark"
socketio = SocketIO(app)
@app.route("/")
def index():
return render_template("index.html")
# 出現消息後,率先執行此處
@socketio.on("message",namespace="/Socket")
def socket(message):
print("接收到消息:",message['data'])
for i in range(1,100):
socketio.sleep(1)
socketio.emit("response", # 綁定通信
{"Data":i}, # 傳回socket資料
namespace="/Socket")
# 當websocket連接配接成功時,自動觸發connect預設方法
@socketio.on("connect",namespace="/Socket")
def connect():
print("連結建立成功..")
# 當websocket連接配接失敗時,自動觸發disconnect預設方法
@socketio.on("disconnect",namespace="/Socket")
def disconnect():
print("連結建立失敗..")
if __name__ == '__main__':
socketio.run(app,debug=True,host="0.0.0.0")
效果如下,程式會每隔一秒鐘同步一次資料,在控制台中可看到。
使用SocketIO庫繪制主機動态圖形
前端第一個腳本,用于接收資料。
<script type="text/javascript" charset="UTF-8">
// 負責接收目标主機的CPU負載情況
$(document).ready(function() {
namespace = '/Socket';
var socket = io.connect("http://" + document.domain + ":" + location.port + namespace);
socket.emit("message",{"data":"hello lyshark"}); // 初始化完成後,發送一條消息.
socket.on('response', function(recv) {
//console.log(recv.Data);
update(recv) // 發送到update函數處理請求
});
});
</script>
第二個腳本負責解析參數
<script type="text/javascript" charset="UTF-8">
// 負責對參數的解析
var time =["","","","","","","","","",""];
var cpu = [0,0,0,0,0,0,0,0,0,0];
var update = function(recv){
time.push(recv.Data[0]);
cpu.push(parseFloat(recv.Data[1]));
if(time.length >=10){
time.shift();
cpu.shift();
console.log(time)
display(time,cpu) // 調用繪圖函數
}
};
</script>
最後一段代碼負責,調用百度繪圖庫,進行圖形的呈現。
<div id="main" style="height:500px;width:1200px;border:1px solid #eecc11;padding:10px;"></div>
<script type="text/javascript" charset="UTF-8">
var display = function(time,cpu){
// 負責初始化繪圖畫布
var myChart = echarts.init(document.getElementById('main'));
myChart.setOption({
title: {
text: '監控系統CPU資源'
},
tooltip: {},
xAxis: {
data: []
},
yAxis: {},
series: [{
name: 'cpu',
type: 'line',
data: []
}]
});
// 下方就是給指定字段填充資料
myChart.setOption({
xAxis: {
data: time
},
series: [{
name: 'cpu', // 根據名字對應到相應的系列
data: cpu
}]
});
};
// 首次顯示加載動畫
myChart.showLoading();
</script>
後端直接區資料并發送給前台 app.py 需要注意flask 開頭寫法不再是app()而要改成 socketio.run(app,debug=True,host="0.0.0.0")才可以
# name: app.py
from flask import Flask,render_template,request
from flask_socketio import SocketIO
import time,psutil
async_mode = None
app = Flask(__name__)
app.config['SECRET_KEY'] = "lyshark"
socketio = SocketIO(app)
@app.route("/")
def index():
return render_template("index.html")
# 出現消息後,率先執行此處
@socketio.on("message",namespace="/Socket")
def socket(message):
print("接收到消息:",message['data'])
while True:
socketio.sleep(60)
data = time.strftime("%M:%S",time.localtime())
cpu = psutil.cpu_percent(interval=None,percpu=True)
socketio.emit("response",
{"Data":[data,cpu]},
namespace="/Socket")
if __name__ == '__main__':
socketio.run(app,debug=True,host="0.0.0.0")
最終統計效果如下所示,當然也可以批量統計存入資料庫,需要的時候直接調用繪圖。
百度繪圖庫(官方位址):https://www.echartsjs.com/zh/index.html
Ajax實作定時器 另一種實作定時器定時擷取資料的方法
<button type="button" class="btn btn-success" id="btn">定時</button>
<script>
$("#btn").click(function(){
var count = setInterval(function(){
$.ajax({
url:"/_get/",
type:"POST",
contentType:"application/json;charset=utf-8",
success:function (data) {
var data = JSON.parse(data);
console.log("目前進度:" + data.flag);
$("#1111").width(data.flag);
if (data.flag == 100){
clearInterval(count);
}
}
})
},2000); // 每兩秒執行一次
});
</script>
版權聲明:本部落格文章與代碼均為學習時整理的筆記,文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!