国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flask SocketIO 實現(xiàn)動態(tài)繪圖

這篇具有很好參考價值的文章主要介紹了Flask SocketIO 實現(xiàn)動態(tài)繪圖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Flask-SocketIO 是基于 Flask 的一個擴展,用于簡化在 Flask 應用中集成 WebSocket 功能。WebSocket 是一種在客戶端和服務器之間實現(xiàn)實時雙向通信的協(xié)議,常用于實現(xiàn)實時性要求較高的應用,如聊天應用、實時通知等,使得開發(fā)者可以更輕松地構建實時性要求較高的應用。通過定義事件處理函數(shù),可以實現(xiàn)雙向實時通信,為應用提供更加豐富和實時的用戶體驗。

前端參數(shù)拼接

Flask 提供了針對WebSocket的支持插件flask_socketio直接通過pip命令安裝即可導入使用,同時前端也需要引入SocketIO.js庫文件。

如下代碼通過ECharts圖表庫和WebSocket技術實現(xiàn)了一個實時監(jiān)控主機CPU負載的動態(tài)折線圖。通過WebSocket連接到Flask應用中的Socket.IO命名空間,前端通過實時接收后端傳來的CPU負載數(shù)據(jù),動態(tài)更新折線圖,展示1分鐘、5分鐘和15分鐘的CPU負載趨勢。同時,通過控制臺打印實時數(shù)據(jù),實現(xiàn)了方便的調(diào)試和監(jiān)控功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="https://www.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" src="https://www.lyshark.com/javascript/socket.io/socket.io.min.js"></script>
    <script type="text/javascript" src="https://www.lyshark.com/javascript/echarts/5.3.0/echarts.min.js"></script>
</head>
<body>

<div id="Linechart" style="height:500px;width:1200px;border:1px solid #673ab7;padding:10px;"></div>

    <!-- 執(zhí)行繪圖函數(shù)-->
    <script type="text/javascript" charset="UTF-8">
        var display = function(time,x,y,z)
        {
            var echo = echarts.init(document.getElementById("Linechart"));
            var option = {
                title: {
                    left: 'left',
                    text: 'CPU 利用表動態(tài)監(jiān)控',
                },
                // 調(diào)節(jié)大小
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                // tooltip 鼠標放上去之后會自動出現(xiàn)坐標
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },
            legend: {
                data: ['1分鐘負載', '5分鐘負載', '15分鐘負載']
            },

            xAxis: {
                type: 'category',
                // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                data: time
            },
            yAxis: {
                type: 'value'
            },
            series:
            [
                {
                    name: "1分鐘負載",
                    stack: "總量",
                    //data: [10, 25, 99, 87, 54, 66, 2],
                    data: x,
                    type: 'line',
                    areaStyle: {}
                },
                {
                    name: "5分鐘負載",
                    stack: "總量",
                    //data: [89, 57, 85, 44, 25, 4, 54],
                    data: y,
                    type: 'line',
                    areaStyle: {}
                },
                {
                    name: "15分鐘負載",
                    stack: "總量",
                    //data: [1, 43, 2, 12, 5, 4, 7],
                    data: z,
                    type: 'line',
                    areaStyle: {}
                }
            ]
            };
            echo.setOption(option,true);
        }
    </script>

    <!-- 負責對參數(shù)的解析,填充數(shù)據(jù) -->
    <script type="text/javascript" charset="UTF-8">
        var time =["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""];
        var 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];
        var 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];
        var 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];

        var update_function = function(recv)
        {
            time.push(recv.datetime);
            cpu_load1.push(parseFloat(recv.load1));
            cpu_load5.push(parseFloat(recv.load5));
            cpu_load15.push(parseFloat(recv.load15));

            if(time.length >=10)
            {
                time.shift();
                cpu_load1.shift();
                cpu_load5.shift();
                cpu_load15.shift();

                console.log("時間數(shù)組: " + time);
                console.log("1分鐘: " + cpu_load1);
                console.log("5分鐘: " + cpu_load5);
                console.log("15分鐘: " + cpu_load15);

                // 調(diào)用繪圖函數(shù)
                display(time,cpu_load1,cpu_load5,cpu_load15);
            }
        };
    </script>

    <!-- 負責接收目標主機的CPU負載情況 -->
   <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.datetime);
                console.log("1分鐘: " + recv.load1);
                console.log("5分鐘: " + recv.load5);
                console.log("15分鐘: " + recv.load15);

                // 調(diào)用函數(shù)完成數(shù)據(jù)填充
                update_function(recv);
            });
        });
    </script>
</body>
</html>

后臺代碼使用Flask和Flask-SocketIO搭建了一個實時監(jiān)控主機CPU負載的WebSocket應用,并將數(shù)據(jù)通過socketio.emit函數(shù)將數(shù)據(jù)推送給前端展示。

關鍵點概括如下:

Flask和SocketIO集成:

  • 使用Flask框架創(chuàng)建了一個Web應用,并通過Flask-SocketIO集成了WebSocket功能,實現(xiàn)了實時雙向通信。

消息接收與實時推送:

  • 定義了socket事件處理函數(shù),用于接收前端通過WebSocket發(fā)送的消息。在無限循環(huán)中,通過socketio.sleep方法設置每2秒推送一次實時的CPU負載數(shù)據(jù)給前端。

前端連接和斷開事件:

  • 定義了connectdisconnect事件處理函數(shù),分別在WebSocket連接建立和斷開時觸發(fā)。在控制臺打印相應信息,用于監(jiān)控連接狀態(tài)。

實時數(shù)據(jù)推送:

  • 使用socketio.emit方法實時將CPU負載數(shù)據(jù)推送給前端,以更新折線圖。推送的數(shù)據(jù)包括當前時間、1分鐘負載、5分鐘負載和15分鐘負載。

前端頁面渲染:

  • 通過Flask的render_template方法渲染了一個HTML頁面,用于展示實時更新的CPU負載折線圖。

調(diào)試信息輸出:

  • 在每個事件處理函數(shù)中使用print語句輸出調(diào)試信息,方便監(jiān)測WebSocket連接和消息的傳遞過程。

總體來說,該應用實現(xiàn)了一個簡單而實用的實時監(jiān)控系統(tǒng),通過WebSocket技術實時推送主機CPU負載數(shù)據(jù)至前端,為用戶提供了實時可視化的監(jiān)控體驗。

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(2)
        data = time.strftime("%M:%S",time.localtime())
        cpu = psutil.cpu_percent(interval=None,percpu=True)

        socketio.emit("response",
                      {"datetime": data, "load1": cpu[0], "load5": cpu[1], "load15": cpu[2]},
                      namespace="/Socket")

# 當websocket連接成功時,自動觸發(fā)connect默認方法
@socketio.on("connect",namespace="/Socket")
def connect():
    print("鏈接建立成功..")

# 當websocket連接失敗時,自動觸發(fā)disconnect默認方法
@socketio.on("disconnect",namespace="/Socket")
def disconnect():
    print("鏈接建立失敗..")

if __name__ == '__main__':
    socketio.run(app,debug=True)

運行后,即可輸出當前系統(tǒng)下CPU的負載情況,如下圖所示;

Flask SocketIO 實現(xiàn)動態(tài)繪圖

后端參數(shù)拼接

如上所示的代碼是在前端進行的數(shù)據(jù)拼接,如果我們想要在后端進行數(shù)據(jù)的拼接,則需要對代碼進行一定的改進。

前端編寫以下代碼,通過WebSocket建立通信隧道,而后臺則每隔2秒向前臺推送傳遞字典數(shù)據(jù)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="https://www.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" src="https://www.lyshark.com/javascript/socket.io/socket.io.min.js"></script>
    <script type="text/javascript" src="https://www.lyshark.com/javascript/echarts/5.3.0/echarts.min.js"></script>
</head>
<body>

<div id="Linechart" style="height:500px;width:1200px;border:1px solid #673ab7;padding:10px;"></div>

    <!-- 執(zhí)行繪圖函數(shù)-->
    <script type="text/javascript" charset="UTF-8">
        var display = function(time,x,y,z)
        {
            var echo = echarts.init(document.getElementById("Linechart"));
            var option = {
                title: {
                    left: 'left',
                    text: 'CPU 利用表動態(tài)監(jiān)控',
                },
                // 調(diào)節(jié)大小
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                // tooltip 鼠標放上去之后會自動出現(xiàn)坐標
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },
            legend: {
                data: ['1分鐘負載', '5分鐘負載', '15分鐘負載']
            },

            xAxis: {
                type: 'category',
                // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                data: time
            },
            yAxis: {
                type: 'value'
            },
            series:
            [
                {
                    name: "1分鐘負載",
                    stack: "總量",
                    //data: [10, 25, 99, 87, 54, 66, 2],
                    data: x,
                    type: 'line',
                    areaStyle: {}
                },
                {
                    name: "5分鐘負載",
                    stack: "總量",
                    //data: [89, 57, 85, 44, 25, 4, 54],
                    data: y,
                    type: 'line',
                    areaStyle: {}
                },
                {
                    name: "15分鐘負載",
                    stack: "總量",
                    //data: [1, 43, 2, 12, 5, 4, 7],
                    data: z,
                    type: 'line',
                    areaStyle: {}
                }
            ]
            };
            echo.setOption(option,true);
        }
    </script>

    <!-- 負責接收目標主機的CPU負載情況 -->
   <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.datetime);
                console.log("1分鐘: " + recv.load1);
                console.log("5分鐘: " + recv.load5);
                console.log("15分鐘: " + recv.load15);

                // 調(diào)用繪圖函數(shù)
                display(recv.datetime,recv.load1,recv.load5,recv.load15);
            });
        });
    </script>
</body>
</html>

后臺代碼則是收集數(shù)據(jù),并將數(shù)據(jù)通過socketio.emit函數(shù),推送給前端。

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)

# 填充數(shù)據(jù)表
local_time = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
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]
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]
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]

# 左移填充
def shift(Array, Size, Push):
    if len(Array) <= Size and len(Array) >= 0:
        Array.pop(0)
        Array.append(Push)
        return True
    return False

# 右移填充
def unshift(Array, Size, Push):
    if len(Array) <= Size and len(Array) >= 0:
        Array.pop(Size-1)
        Array.insert(0,Push)

@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(1)
        data = time.strftime("%M:%S",time.localtime())
        cpu = psutil.cpu_percent(interval=None,percpu=True)

        # 實現(xiàn)數(shù)組最大35,每次左移覆蓋第一個
        shift(local_time,35,data)
        shift(cpu_load1,35,cpu[0])
        shift(cpu_load5, 35, cpu[1])
        shift(cpu_load15, 35, cpu[2])

        socketio.emit("response",
                      {"datetime": local_time, "load1": cpu_load1, "load5": cpu_load5, "load15": cpu_load15},
                      namespace="/Socket")

# 當websocket連接成功時,自動觸發(fā)connect默認方法
@socketio.on("connect",namespace="/Socket")
def connect():
    print("鏈接建立成功..")

# 當websocket連接失敗時,自動觸發(fā)disconnect默認方法
@socketio.on("disconnect",namespace="/Socket")
def disconnect():
    print("鏈接建立失敗..")

if __name__ == '__main__':
    socketio.run(app,debug=True)

運行動態(tài)圖如下所示;

Flask SocketIO 實現(xiàn)動態(tài)繪圖文章來源地址http://www.zghlxwxcb.cn/news/detail-747745.html

到了這里,關于Flask SocketIO 實現(xiàn)動態(tài)繪圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【快速開始】一個簡單的Flask-SocketIO應用,完成后端推送消息接收與關閉

    【快速開始】一個簡單的Flask-SocketIO應用,完成后端推送消息接收與關閉

    本人使用環(huán)境及版本: Anaconda: 虛擬環(huán)境: Python版本:3.8.13 安裝包及版本: Flask-SocketIO :5.3.4 eventlet :0.33.3 創(chuàng)建app.py文件(文件名隨意,不過要與后面的運行腳本中指定的文件保持一致) cmd 或者 linux控制臺運行即可 此時能看到如下圖所示 此時訪問http://0.0.0.0:5200(0.0.0

    2024年02月13日
    瀏覽(33)
  • flask框架-[實現(xiàn)websocket]:將socketio處理函數(shù)部分集中管理,使用類的方式來管理,集中管理socketio處理函數(shù)

    注意:在flask2.x版本依賴,不再支持flask_script了 flask2.x版本會自動注冊 flask run 和flask db 兩個命令行命令 1、啟動項目 flask run --host 0.0.0.0 --port 9000 2、數(shù)據(jù)庫遷移命令 flask db init flask db migrate flask db upgrade apps ????????__init__.py? : 創(chuàng)建app應用,各種注冊 ??????? websocket ??

    2024年02月07日
    瀏覽(28)
  • Websocket 之flask_socketio和Python socketio

    前端 后端 前端 后端 client server client Flask server 版本問題參考:https://blog.csdn.net/weixin_44986037/article/details/131504760

    2024年02月12日
    瀏覽(24)
  • 【Python_PyQtGraph 學習筆記(五)】基于PyQtGraph和GraphicsLayoutWidget動態(tài)繪圖并實現(xiàn)窗口模式,且保留全部繪圖信息

    【Python_PyQtGraph 學習筆記(五)】基于PyQtGraph和GraphicsLayoutWidget動態(tài)繪圖并實現(xiàn)窗口模式,且保留全部繪圖信息

    基于PySide2、PyQtGraph和GraphicsLayoutWidget動態(tài)繪圖并實現(xiàn)窗口模式,并保留全部繪圖信息:繪制好的圖像既可以顯示全部信息,也可以顯示最新的50個點信息;因為數(shù)據(jù)量的增加,折線會因為窗口大小的固定縮成一團,如果有窗口模式這一功能,可以清楚的看到最新繪制的點,保

    2023年04月26日
    瀏覽(94)
  • flask socketio 實時傳值至html上【需補充實例】

    跨域問題網(wǎng)上的普通方法無法解決。 參考這篇文章解決 Flask教程(十九)SocketIO - 迷途小書童的Note迷途小書童的Note (xugaoxiang.com) 如果用了eventlet,在while true中,emit數(shù)據(jù)不在前端web頁面顯示,可參考這篇文章的解決方案,加定時器。 javascript - Flask-websocket Emit主動發(fā)送消息失敗

    2024年02月07日
    瀏覽(27)
  • 進度變動實時通知-使用SocketIO實現(xiàn)前后端的通信(基于WebSocket的實時通信庫)

    進度變動實時通知-使用SocketIO實現(xiàn)前后端的通信(基于WebSocket的實時通信庫)

    最近在接觸的一個項目,將PDF上傳到項目里,通過調(diào)用OCR云服務把PDF里的表格數(shù)據(jù)識別出來。在此過程中,前后端需要實時通信,對識別數(shù)據(jù)進行“進度跟蹤”。因此我們采用SocketIO的通訊方式,識別中前端和后端服務建立SocketIO連接,根據(jù)事件進行數(shù)據(jù)的實時更新百分比進度

    2024年02月06日
    瀏覽(26)
  • html寫一個向flask_socketio發(fā)送消息和接收消息并顯示在頁面上

    以下是一個簡單的HTML頁面,它包含一個輸入框、一個發(fā)送按鈕和一個顯示區(qū)域。用戶可以在輸入框中輸入消息,點擊發(fā)送按鈕,然后這個消息會被發(fā)送到 Flask-SocketIO 服務器。當服務器回應消息時,它會在頁面的顯示區(qū)域顯示出來。 此外,F(xiàn)lask-SocketIO 服務器端代碼可以處理客

    2024年02月11日
    瀏覽(28)
  • Flask基于flask_login實現(xiàn)登錄、驗證碼

    Flask基于flask_login實現(xiàn)登錄、驗證碼

    flask_login 是一個 Flask 擴展,用于在 Flask web 應用中實現(xiàn)用戶會話管理。它允許你跟蹤哪些用戶已經(jīng)登錄,并管理他們的登錄狀態(tài)。flask_login 提供了用戶認證的基礎結構,但具體的用戶驗證(如用戶名和密碼檢查)和存儲(如數(shù)據(jù)庫)需要你自行實現(xiàn)。 以下是 flask_login 的一些

    2024年04月15日
    瀏覽(24)
  • 基于Flask的問答系統(tǒng)的設計與實現(xiàn)

    基于Flask的問答系統(tǒng)的設計與實現(xiàn)

    這個項目剛開始是跟著嗶哩嗶哩上的一個教程學習的,后面完成初步實現(xiàn)后,我按照自己的設計加入了新的功能。 用戶表(user) 問題表(question) 回答表(answer) 回復表(reply) 郵箱驗證碼表(email_captcha) 問題瀏覽數(shù)量 問題評論數(shù)量 最熱文章列表按照文章瀏覽數(shù)量從高到低排列,點擊

    2024年02月15日
    瀏覽(11)
  • 基于Flask的留言板的設計與實現(xiàn)

    基于Flask的留言板的設計與實現(xiàn)

    這是《Flask Web開發(fā)實戰(zhàn):入門、進階與原理解析》這本書中的一個小項目,我在學習后根據(jù)書中的教程實現(xiàn)了留言板的功能,并結合我的思路將代碼做了一些調(diào)整。 下面這是實現(xiàn)后的展示圖片 留言板得有一個表單提供昵稱以及留言的輸入功能,在數(shù)據(jù)庫保存的數(shù)據(jù)應該包括(

    2024年02月01日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包