Python Flask利用SocketIO庫實(shí)現(xiàn)圖表的繪制
Flask 默認(rèn)提供了針對WebSocket的支持插件from flask_socketio import SocketIO 直接通過pip命令安裝即可導(dǎo)入使用,前端也需要引入socketIO庫文件,其網(wǎng)站首頁是:socket.io/
實(shí)現(xiàn)簡單的數(shù)據(jù)通信
新建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"}); // 初始化完成后,發(fā)送一條消息. 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") # 出現(xiàn)消息后,率先執(zhí)行此處 @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數(shù)據(jù) namespace="/Socket") # 當(dāng)websocket連接成功時,自動觸發(fā)connect默認(rèn)方法 @socketio.on("connect",namespace="/Socket") def connect(): print("鏈接建立成功..") # 當(dāng)websocket連接失敗時,自動觸發(fā)disconnect默認(rèn)方法 @socketio.on("disconnect",namespace="/Socket") def disconnect(): print("鏈接建立失敗..") if __name__ == '__main__': socketio.run(app,debug=True,host="0.0.0.0")
效果如下,程序會每隔一秒鐘同步一次數(shù)據(jù),在控制臺中可看到。
使用SocketIO庫繪制主機(jī)動態(tài)圖形
前端第一個腳本,用于接收數(shù)據(jù)。
<script type="text/javascript" charset="UTF-8"> // 負(fù)責(zé)接收目標(biāo)主機(jī)的CPU負(fù)載情況 $(document).ready(function() { namespace = '/Socket'; var socket = io.connect("http://" + document.domain + ":" + location.port + namespace); socket.emit("message",{"data":"hello lyshark"}); // 初始化完成后,發(fā)送一條消息. socket.on('response', function(recv) { //console.log(recv.Data); update(recv) // 發(fā)送到update函數(shù)處理請求 }); }); </script>
第二個腳本負(fù)責(zé)解析參數(shù)
<script type="text/javascript" charset="UTF-8"> // 負(fù)責(zé)對參數(shù)的解析 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) // 調(diào)用繪圖函數(shù) } }; </script>
最后一段代碼負(fù)責(zé),調(diào)用百度繪圖庫,進(jìn)行圖形的呈現(xiàn)。
<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){ // 負(fù)責(zé)初始化繪圖畫布 var myChart = echarts.init(document.getElementById('main')); myChart.setOption({ title: { text: '監(jiān)控系統(tǒng)CPU資源' }, tooltip: {}, xAxis: { data: [] }, yAxis: {}, series: [{ name: 'cpu', type: 'line', data: [] }] }); // 下方就是給指定字段填充數(shù)據(jù) myChart.setOption({ xAxis: { data: time }, series: [{ name: 'cpu', // 根據(jù)名字對應(yīng)到相應(yīng)的系列 data: cpu }] }); }; // 首次顯示加載動畫 myChart.showLoading(); </script>
后端直接區(qū)數(shù)據(jù)并發(fā)送給前臺 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") # 出現(xiàn)消息后,率先執(zhí)行此處 @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")
最終統(tǒng)計效果如下所示,當(dāng)然也可以批量統(tǒng)計存入數(shù)據(jù)庫,需要的時候直接調(diào)用繪圖。
百度繪圖庫(官方地址):https://echartsjs.com/
Ajax實(shí)現(xiàn)定時器 另一種實(shí)現(xiàn)定時器定時獲取數(shù)據(jù)的方法
<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("當(dāng)前進(jìn)度:" + data.flag); $("#1111").width(data.flag); if (data.flag == 100){ clearInterval(count); } } }) },2000); // 每兩秒執(zhí)行一次 }); </script>
到此這篇關(guān)于Python Flask利用SocketIO庫實(shí)現(xiàn)圖表的繪制的文章就介紹到這了,更多相關(guān)Python Flask SocketIO繪制圖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 隨機(jī)打亂 圖片和對應(yīng)的標(biāo)簽方法
今天小編就為大家分享一篇python 隨機(jī)打亂 圖片和對應(yīng)的標(biāo)簽方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python3.6.4安裝opencv3.4.2的實(shí)現(xiàn)
這篇文章主要介紹了python3.6.4安裝opencv3.4.2的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10Python基于Socket實(shí)現(xiàn)簡易多人聊天室的示例代碼
這篇文章主要介紹了Python基于Socket實(shí)現(xiàn)簡易多人聊天室的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11pandas 數(shù)據(jù)歸一化以及行刪除例程的方法
今天小編就為大家分享一篇pandas 數(shù)據(jù)歸一化以及行刪除例程的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Tensorflow 實(shí)現(xiàn)分批量讀取數(shù)據(jù)
今天小編就為大家分享一篇Tensorflow 實(shí)現(xiàn)分批量讀取數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python異步編程之a(chǎn)syncio低階API的使用詳解
asyncio中低階API的種類很多,涉及到開發(fā)的5個方面,這篇文章主要為大家詳細(xì)介紹了這些低階API的具體使用,感興趣的小伙伴可以學(xué)習(xí)一下2024-01-01神經(jīng)網(wǎng)絡(luò)python源碼分享
這篇文章主要介紹了神經(jīng)網(wǎng)絡(luò)python源碼分享,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12