Flask Echarts 实现历史图形查询

news2024/11/15 5:58:37

Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递。用户界面使用ECharts图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图,能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型,包括折线图、柱状图、饼图、散点图等,同时还支持动画效果、数据筛选、区域缩放等交互功能。

Flask后端通过render_template方法将查询得到的JSON数据传递至前端,使得用户能够查询特定时间段内的数据。这种交互方式实现了动态图形展示,为用户提供了更直观、实时的数据体验。通过此系统,用户可通过前端界面直接选择时间范围,后台服务器相应地返回相应的数据,实现了数据的动态交互与图形化展示。

JQuery绑定事件

jQuery 是一个快速、轻量级、跨浏览器的JavaScript库。它旨在简化HTML文档遍历、事件处理、动画操作和AJAX等常见任务,使开发者能够更方便地处理DOM操作和前端交互。

以下这段HTML代码实现了一个包含表单的页面,用户可以输入主机地址、开始时间、结束时间以及选择负载类型,然后通过点击按钮进行数据查询。

代码首先通过Ajax接口实现了参数传递,使用了jQuery中的click方法绑定了按钮点击事件。概述如下:

  1. 表单提交和Ajax请求:
    • 在用户填写完表单后,通过jQuery的click方法,给按钮绑定了一个点击事件。
    • 在点击事件中,使用$.ajax函数实现了异步的数据请求。
    • 通过$("#myForm").serialize()将表单数据序列化,然后作为请求参数发送给后端。
  2. 后端响应:
    • 请求的目标URL是根目录(“/”),这可能是Flask或其他后端框架的路由。
    • 后端处理接收到的数据,执行相应的逻辑,并返回一个JSON格式的数据。
  3. 前端处理响应数据:
    • 当Ajax请求成功时,触发了success回调函数。
    • 在回调函数中,使用JSON.parse(data)解析后端返回的JSON字符串,得到一个包含时间、X、Y、Z数据的字典(ref_dict)。
  4. 数据展示:
    • 解析后的数据传递给create_graphical函数。
    • create_graphical函数负责处理这些数据,这里是打印到控制台。

这种结构使得用户在填写表单并点击按钮后,能够通过Ajax请求将数据发送给后端,并在后端执行相应逻辑后返回JSON格式的数据。前端接收到数据后进行解析处理,这里简单打印到控制台,实际应用中可以进一步用于图表的动态更新等操作。这样实现了前后端之间的动态数据传递和交互。如下index.html代码如下所示;

<!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>
</head>
<body>
    <!--提交表格数据-->
    <form action="/" method="post" id="myForm">
        <p>主机地址: <input type="text" name="address" placeholder="输入主机IP地址"></p>
        <p>开始时间: <input type="datetime-local" name="start_datetime" /></p>
        <p>结束时间: <input type="datetime-local" name="end_datetime" /></p>

        <select name="select">
            <option value="load5">五分钟负载</option>
            <option value="load10">十分钟负载</option>
            <option value="load15">十五分钟负载</option>
            <option value="load_all">全部输出</option>
        </select>

        <input name="btn" id="btn" type="button" value="查询数据" />
    </form>

    <!-- 传入参数打印 -->
    <script type="text/javascript" charset="UTF-8">
        var create_graphical = function(time,x,y,z)
        {
            console.log("日期: " + time);
            console.log("X: " + x);
            console.log("Y: " + y);
            console.log("Z: " + z);
        }
    </script>

    <!--点击查询后执行的Ajax操作-->
    <script type="text/javascript">
        $("#btn").click(function()
        {
            $.ajax({
                url: "/",
                type: "POST",
                data: $("#myForm").serialize(),
                success:function (data)
                {
                    var ref_dict = JSON.parse(data);
                    create_graphical(ref_dict.time, ref_dict.x, ref_dict.y, ref_dict.z)
                }
            })
        })
    </script>
</body>

后台app.py则通过request.form.get方法接收用户数据,并将收到的数据打印到后台,将数据拼接组合成一个JSON数组并使用json.dumps()将数据返回给前端;

from flask import Flask,render_template,request
import json

app = Flask(__name__)

@app.route('/',methods=['POST','GET'])
def index():

    if request.method == "GET":
        return render_template("index.html")

    elif request.method == "POST":
            address = request.form.get("address")
            start_datetime = request.form.get("start_datetime")
            end_datetime = request.form.get("end_datetime")
            select_value = request.form.get("select")
            print(address,start_datetime,end_datetime,select_value)

            ref_time = ["11:12","11:13","11:14","11:15","11:16"]
            ref_x = [4,5,8,9,4]
            ref_y = [6,7,8,9,0]
            ref_z = [4,3,2,4,6]

            ref_dict = {"time":ref_time, "x": ref_x, "y": ref_y, "z": ref_z}
            return json.dumps(ref_dict, ensure_ascii=False)

if __name__ == '__main__':
    app.run()

运行代码,通过填入不同的参数传入后台,前台则可以看到后台回传参数,如下图所示;

生成测试数据

如下提供的这段代码的主要功能是定期获取主机的CPU负载数据,将数据插入SQLite数据库中。这种实时数据采集的方式可用于监控系统性能,尤其是在Web应用中,可以用于实时更新图表或报告系统的负载情况,运行这段程序并等待5分钟的数据采集。

以下是对该代码的概述:

  1. 数据库创建函数 (CreateDB):
    • 连接到SQLite数据库(database.db)。
    • 创建了一个名为 CpuLoadDB 的表,包含主机地址 (address)、时间 (times)、5分钟负载 (load5)、10分钟负载 (load10)、15分钟负载 (load15) 的字段。
  2. 获取CPU负载函数 (GetCPU):
    • 获取当前时间并格式化为字符串。
    • 使用 psutil.cpu_percent 获取实时CPU负载,返回一个包含主机地址、时间、5分钟负载、10分钟负载、15分钟负载的字典。
  3. 主程序 (__main__):
    • 调用 CreateDB 函数创建数据库表。
    • 进入一个无限循环,每次循环中获取CPU负载数据,构建插入语句,并将数据插入数据库中。
    • 在控制台打印插入语句,便于调试。
    • 通过 time.sleep(1) 控制每秒执行一次,模拟实时数据更新。
import sqlite3
import time,psutil,datetime

def CreateDB():
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()

    create = "create table CpuLoadDB(" \
             "address char(32) not null," \
             "times char(32) not null," \
             "load5 char(32) not null," \
             "load10 char(32) not null," \
             "load15 char(32) not null" \
             ")"
    cursor.execute(create)
    conn.commit()
    cursor.close()
    conn.close()

def GetCPU(addr):
    times = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M")
    cpu = psutil.cpu_percent(interval=None,percpu=True)

    dict = {'address': addr,'times': times,'load5': cpu[0],'load10': cpu[1],'load15':cpu[2]}
    return dict

if __name__ == "__main__":
    CreateDB()

    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    while True:
        dict = GetCPU("127.0.0.1")
        insert = 'insert into CpuLoadDB(address,times,load5,load10,load15) values("{}","{}","{}","{}","{}")'.\
            format(dict["address"],dict["times"],dict["load5"],dict["load10"],dict["load15"])
        print(insert)
        cursor.execute(insert)
        conn.commit()
        time.sleep(1)

运行上述程序,开始时间2023-11-27 15:17 结束于2023-11-27 15:36,采集到的数据如下图所示;

实现历史查询

通过简洁而功能强大的前端页面,用户可以选择主机、设定时间范围,并实时查看CPU负载的变化。后端使用Flask框架搭建,借助psutil库获取实时CPU负载数据,并将数据存储在SQLite数据库中。前端使用jQuery和ECharts库,通过Ajax请求实现与后端的动态数据交互,并在页面上实时绘制CPU负载的折线图。

数据生后后,我们在原来代码基础之上增加echarts.js绘图库代码,用户在前台填写表格并发送给后端,当后端处理后输出给前端JSON格式,前端获取到该格式之后自动再将其绘制出来,代码如下所示;

<!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/echarts/5.3.0/echarts.min.js"></script>
</head>

<body>
    <!--提交表格数据-->
    <form action="/" method="post" id="myForm">
        <!-- <p>主机地址: <input type="text" name="address" placeholder="输入主机IP地址"></p>-->
        <p>选择主机: <select name="address" style="width: 185px; height: 25px">
            {% for item in addr %}
                <option value="{{ item }}">{{ item }}</option>
            {% endfor %}
        </select></p>

        <p>开始时间: <input type="datetime-local" name="start_datetime" /></p>
        <p>结束时间: <input type="datetime-local" name="end_datetime" /></p>

        <p>选择图形: <select name="select" style="width: 185px; height: 25px">
            <option value="load5">五分钟负载</option>
            <option value="load10">十分钟负载</option>
            <option value="load15">十五分钟负载</option>
        </select></p>

        <input name="btn" id="btn" type="button" value="查询数据" />
    </form>

    <!--绘图区域-->
    <div id="main" style="width: 100%;height:450px;border:1px solid #dddddd;float: left;margin-top: 10px;"></div>

    <!--绘图函数实现流程-->
    <script type="text/javascript" charset="UTF-8">
        var create_graphical = function(time,cpu)
        {
            var myChart_cpu = echarts.init(document.getElementById('main'));
            myChart_cpu.setOption({
                tooltip: {},
                animation: false,
                xAxis: {
                    data: []
                },
                // 调节大小
                grid: {
                    left: '3%',
                    right: '4%',
                    top:'3%',
                    bottom: '3%',
                    containLabel: true
                },
                // tooltip 鼠标放上去之后会自动出现坐标
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },

               // 初始化图形
                yAxis: {},
                series: [{
                    type: 'line',
                    data: []
                }]
            });

            // 下方就是给指定字段填充数据
            myChart_cpu.setOption({
                xAxis: {
                    data: time
                },
                series: [{
                    name: 'CPU负载率',
                    data: cpu
                }]
                });
        };
    </script>

    <!--点击查询后执行的Ajax操作-->
    <script type="text/javascript">
        $("#btn").click(function()
        {
            $.ajax({
                url: "/",
                type: "POST",
                dataType: "text",
                data: $("#myForm").serialize(),
                success:function (data)
                {
                    var ref_dict = JSON.parse(data);
                    create_graphical(ref_dict.time, ref_dict.cpu)
                }
            })
        })
    </script>
</body>

后端首先判断请求来源,如果是GET方式请求,则先查询数据库中有哪些IP地址,并对这些地址去重后返回给前端的select组件,而如果是POST请求,则根据条件匹配记录,并将匹配结果返回给前台即可,后端代码如下所示;

from flask import Flask,render_template,request
import json
import sqlite3

app = Flask(__name__)

@app.route('/',methods=['POST','GET'])
def index():
    if request.method == "GET":
        # 数据库去重后保存
        address_set = set()

        conn = sqlite3.connect("database.db")
        cursor = conn.cursor()

        # 查询数据中的地址,并去重
        for address_count in cursor.execute("select address from CpuLoadDB;").fetchall():
            address_set.add(address_count[0])

        return render_template("index.html",addr = list(address_set))

    elif request.method == "POST":
            address = request.form.get("address")
            start_datetime = request.form.get("start_datetime")
            end_datetime = request.form.get("end_datetime")
            select_value = request.form.get("select")

            time_ref = []
            cpu_load_ref = []

            # 查询数据
            conn = sqlite3.connect("database.db")
            cursor = conn.cursor()

            select = "select * from CpuLoadDB where address=='{}' and times >='{}' and times <='{}'".\
                format(address,start_datetime,end_datetime)

            if select_value == "load5":
                # 查询记录并过滤
                for ref in cursor.execute(select).fetchall():
                    time_ref.append(ref[1].split("T")[1])
                    cpu_load_ref.append(float(ref[2]))

                ref_dict = {"time":time_ref, "cpu": cpu_load_ref}
                return json.dumps(ref_dict, ensure_ascii=False)

            if select_value == "load10":
                for ref in cursor.execute(select).fetchall():
                    time_ref.append(ref[1].split("T")[1])
                    cpu_load_ref.append(float(ref[3]))

                ref_dict = {"time":time_ref, "cpu": cpu_load_ref}
                return json.dumps(ref_dict, ensure_ascii=False)

            if select_value == "load15":
                for ref in cursor.execute(select).fetchall():
                    time_ref.append(ref[1].split("T")[1])
                    cpu_load_ref.append(float(ref[4]))

                ref_dict = {"time": time_ref, "cpu": cpu_load_ref}
                return json.dumps(ref_dict, ensure_ascii=False)

if __name__ == '__main__':
    app.run()

代码被运行后,会首次使用GET方式获取主机列表及负载单选框列表,此处我们查询开始时间2023-11-27 15:20 结束于2023-11-27 15:30,这10分钟的数据,采集到的数据如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1261404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度剖析API接口测试工具的企业价值

随着企业软件开发的日益复杂和互联网应用的普及&#xff0c;API接口成为不同软件系统之间信息传递的桥梁。在这一背景下&#xff0c;API接口测试工具的应用变得愈加重要&#xff0c;对企业的发展和软件质量起到了关键性的作用。本文将深入探讨API接口测试工具在企业中的重要性&…

进程(4)——进程地址空间【linux】

进程&#xff08;4&#xff09;——进程地址空间【linux】 一.什么是进程地址空间二.进程地址空间不是真实地址&#xff1f;三.物理地址与进程地址空间的关系&#xff08;整体部分&#xff09;四. 细节4.1 进程地址空间的本质&#xff1a;4.2 为什么要有进程地址空间&#xff1…

机器学习——多元线性回归升维

机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义&#xff1a;将原始的数据表示从低维空间映射到高维空间。在线性回归中&#xff0c;升维通常是通过引入额外的特征来实现的&#xff0c;目的是为了更好地捕捉数据的复杂性&#…

MacOS 系统 Flutter开发Android 环境配置

上节我们已经把 开发工具准备齐全&#xff0c;并可以进行Flutter的web开发&#xff0c;本节将做安卓开发环境进行详细说明 接上节这里先说下&#xff0c;系统环境 MacOS14 &#xff08;Sonoma&#xff09; 芯片 Apple M3 执行命令&#xff1a;flutter doctor 提示如下&#…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)一

第三部分&#xff1a;Shell高级&#xff08;一&#xff09; 这一章讲解 Shell 脚本编程的进阶内容&#xff0c;主要涉及重定向、文件描述符、管道和过滤器、子 Shell、信号等。 本章会使用到一些底层的编程知识&#xff0c;有C语言和 C 编程经验的程序员阅读起来将会更加轻松。…

《微信小程序开发从入门到实战》学习三十三

第四章 云开发 本章云开发技术的功能与使用&#xff0c;包括以下几点&#xff1a; 1.学习使用云开发控制台 2.学习云开发JSON数据库功能 3.学习云开文件存储功能 4.学习云函数功能 5.使用云开发技术实现投票小程序的服务端功能 投票小程序大部分已经实现。需要实现&#…

人工智能-优化算法之凸集

凸性 凸性&#xff08;convexity&#xff09;在优化算法的设计中起到至关重要的作用&#xff0c; 这主要是由于在这种情况下对算法进行分析和测试要容易。 换言之&#xff0c;如果算法在凸性条件设定下的效果很差&#xff0c; 那通常我们很难在其他条件下看到好的结果。 此外&…

二叉堆与优先队列

二叉堆与优先队列 1、什么是二叉堆 1.1、初识二叉堆 什么是二叉堆&#xff1f; 二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型。 最大堆&#xff08;也叫大顶堆&#xff09;&#xff1a;任意节点的值都大于或等于它的左右孩子节点的值&#xff0c;并且最大的值位…

SHAP(一):具有 Shapley 值的可解释 AI 简介

SHAP&#xff08;一&#xff09;&#xff1a;具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法&#xff0c;具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 Shapley 的机器学习模型解释。 我…

NX二次开发UF_CURVE_create_arc_point_tangent_radius 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_tangent_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_tangent_radius(tag_t point, tag_t tangent_object, double radius, UF_CURVE_…

初识前后端数据交互(新手篇)

一个软件项目的开发必然是离不开前端和后端的协作&#xff0c;对于刚入行的新手前端或者新手后端来说&#xff0c;很有必要了解一下对方是在做什么&#xff0c;以及提供给自己什么样的帮助&#xff0c;为什么需要对方共同协作才能完成整个软件项目的开发呢&#xff1f;希望这篇…

Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…

从0开始学习JavaScript--JavaScript对象继承深度解析

JavaScript中的对象继承是构建灵活、可维护代码的关键部分。本文将深入讨论JavaScript中不同的继承方式&#xff0c;包括原型链继承、构造函数继承、组合继承等&#xff0c;并通过丰富的示例代码展示它们的应用和差异。通过详细解释&#xff0c;大家可以更全面地了解如何在Java…

Shopee如何入驻?如何防封?

Shopee作为东南亚领航电商平台&#xff0c;面向东南亚蓝海市场&#xff0c;近年来随着东南亚市场蒸蒸日上&#xff0c;虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

15、矩阵键盘密码锁

矩阵键盘密码锁 main.c #include <REGX52.H> #include "Delay.h" #include "LCD1602.h" #include "MatrixKey.h"//初始化变量 unsigned char KeyNum; unsigned int Password,Count;void main() {//LCD屏幕初始化显示Password:LCD_Init();…

kafka的详细安装部署

简介&#xff1a; Kafka是一个分布式流处理平台&#xff0c;主要用于处理高吞吐量的实时数据流。Kafka最初由LinkedIn公司开发&#xff0c;现在由Apache Software Foundation维护和开发。 Kafka的核心是一个分布式发布-订阅消息系统&#xff0c;它可以处理大量的消息流&#…

matplotlib,DLL load failed: 找不到指定的模块

问题&#xff1a;import matplotlib mportError: DLL load failed: 找不到指定的模块 &#xff08;2023年11月28日&#xff09; 解决方法&#xff1a;具体是matplotlib版本不匹配&#xff0c;而且在线pip install numpy时因为在线下载numpy库中缺少DLL。 应该下载带有mkl的num…

利用ogr2ogr从PostGIS中导出/导入Tab/Dxf/Geojson等格式数据

ogr2ogr Demo Command 先查看下当前gdal支持的全部格式&#xff0c;部分gdal版本可能不支持PostGIS。 如出现PostgreSQL表名支持。 #全部支持的格式 ogrinfo --formats | sort #AVCBin -vector- (rov): Arc/Info Binary Coverage #AVCE00 -vector- (rov): Arc/Info E00 (ASC…