Flask Echarts 实现历史图形查询
Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递。用户界面使用ECharts图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图,能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型,包括折线图、柱状图、饼图、散点图等,同时还支持动画效果、数据筛选、区域缩放等交互功能。
Flask后端通过render_template方法将查询得到的JSON数据传递至前端,使得用户能够查询特定时间段内的数据。这种交互方式实现了动态图形展示,为用户提供了更直观、实时的数据体验。通过此系统,用户可通过前端界面直接选择时间范围,后台服务器相应地返回相应的数据,实现了数据的动态交互与图形化展示。
JQuery绑定事件
jQuery 是一个快速、轻量级、跨浏览器的JavaScript库。它旨在简化HTML文档遍历、事件处理、动画操作和AJAX等常见任务,使开发者能够更方便地处理DOM操作和前端交互。
以下这段HTML代码实现了一个包含表单的页面,用户可以输入主机地址、开始时间、结束时间以及选择负载类型,然后通过点击按钮进行数据查询。
代码首先通过Ajax接口实现了参数传递,使用了jQuery中的click方法绑定了按钮点击事件。概述如下:
- 表单提交和Ajax请求:
- 在用户填写完表单后,通过jQuery的
click方法,给按钮绑定了一个点击事件。 - 在点击事件中,使用
$.ajax函数实现了异步的数据请求。 - 通过
$("#myForm").serialize()将表单数据序列化,然后作为请求参数发送给后端。
- 在用户填写完表单后,通过jQuery的
- 后端响应:
- 请求的目标URL是根目录(“/”),这可能是Flask或其他后端框架的路由。
- 后端处理接收到的数据,执行相应的逻辑,并返回一个JSON格式的数据。
- 前端处理响应数据:
- 当Ajax请求成功时,触发了
success回调函数。 - 在回调函数中,使用
JSON.parse(data)解析后端返回的JSON字符串,得到一个包含时间、X、Y、Z数据的字典(ref_dict)。
- 当Ajax请求成功时,触发了
- 数据展示:
- 解析后的数据传递给
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 jsonapp = 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分钟的数据采集。
以下是对该代码的概述:
- 数据库创建函数 (
CreateDB):- 连接到SQLite数据库(
database.db)。 - 创建了一个名为
CpuLoadDB的表,包含主机地址 (address)、时间 (times)、5分钟负载 (load5)、10分钟负载 (load10)、15分钟负载 (load15) 的字段。
- 连接到SQLite数据库(
- 获取CPU负载函数 (
GetCPU):- 获取当前时间并格式化为字符串。
- 使用
psutil.cpu_percent获取实时CPU负载,返回一个包含主机地址、时间、5分钟负载、10分钟负载、15分钟负载的字典。
- 主程序 (
__main__):- 调用
CreateDB函数创建数据库表。 - 进入一个无限循环,每次循环中获取CPU负载数据,构建插入语句,并将数据插入数据库中。
- 在控制台打印插入语句,便于调试。
- 通过
time.sleep(1)控制每秒执行一次,模拟实时数据更新。
- 调用
import sqlite3
import time,psutil,datetimedef 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 dictif __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 sqlite3app = 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分钟的数据,采集到的数据如下图所示;

相关文章:
Flask Echarts 实现历史图形查询
Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递。用户界面使用ECharts图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图,能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型,包括折线图、柱状图、饼图、散点…...
【漫谈】信创
近些年来,自主创新绝对是高频词汇。 以往是供应链、芯片领域,现在终于到了信息领域。 近期,从上至下、从中央到地方、从政府到国企,各层面、各行业、各领域都在提及“信创”。 信创是个大工程,从计算机通用处理器、…...
linux wget --no-check-certificate
如果您希望每次使用wget命令时都跳过SSL证书检查,可以将–no-check-certificate参数添加到wget的默认配置文件中。 请按照以下步骤进行操作: vi ~/.wgetrc# 插入内容 check_certificate off保存并关闭文件。 现在,wget命令将在每次使用时自…...
mysql命令行连接数据库
有时项目连接不上数据库,报错鉴权失败,先用mysql工具连接下,容易发现问题。 直接输入mysql看是否已安装,如果没有就安装下。 # 注:直接mysql就行,不用-cli也不用-client,也不用-server…...
计算机丢失vcomp140.dll是什么意思,如何解决与修复(附教程)
vcomp140.dll缺失的5种解决方法以及vcomp140.dll缺失原因 引言: 在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是“vcomp140.dll缺失”。这个错误提示通常出现在运行某些程序或游戏时,给使用者带来了困扰。本文…...
基于SSM实现的叮当书城
一、系统架构 前端:jsp | jquery | layui 后端:spring | springmvc | mybatis 环境:jdk1.7以上 | mysql | maven 二、代码与数据库 三、功能介绍 01. 系统首页 02. 商品分类 03. 热销 04. 新品 05. 注册 06. 登录 07. 购物车 08. 后台-首页 …...
python基础练习题库实验5
文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目总结题目1 编写一个程序,使用while循环语句和字符串格式显示以下精确输出。 例如: …...
JS手写instanceof(内含源码与详解)
前言 本文主要讲解JavaScript如何手写一个简易的instanceof,从而实现数据类型判断的作用.那么好,本文正式开始. instanceof作用 instanceOf的作用就是用来判断JavaScript中的数据类型是否是开发所输入的那种, 语法格式:obj instanceof objtype 左侧就是要判断的数据,而右侧就…...
无公网IP下,如何实现公网远程访问MongoDB文件数据库
文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…...
初始化的内容写到析构函数中。。。。。。。
大概是,把应该在构造函数中初始化的堆栈窗体代码写到了析构函数中。。。。 不是因为没掌握构造/析构,而是。。。。 检查了四十多分钟没检查出来。。 被自己蠢哭。 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) { }…...
git 使用过程错误集合
文章目录 1、git-credential-manager-core was renamed to git-credential-manager2、credential-manager-core is not a git command. See git --help. 1、git-credential-manager-core was renamed to git-credential-manager 出现以下提示建议尽快更新您的 Git 配置以使用新…...
Lua判断字符串包含另一个字符串
string.find(“原字符串”,“目标字符串”) 返回这个子串的起始索引和结束索引,否则就会返回nil local index sting.find("ABCD",AB) --结果 1 2 if(index ~ nil)return true endstring.match(“原字符串”,“目标字符串”) local result string.mat…...
二叉树之推排序(升序)
目录 1.思路1.1大堆的建立方法1.2排序的方法 2.代码实现以及测试代码 1.思路 如何将一个堆进行排序,并变成升序?首先,如果要完成升序,那我们可以建立一个大堆,因为大堆可以选出一个最大的值放在堆的最上面,…...
【Docker项目实战】使用Docker部署Plik临时文件上传系统
【Docker实战项目】使用Docker部署Plik 临时文件上传系统 一、Plik介绍1.1 Plik简介1.2 Plik特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Plik镜像五、部署Plik临时…...
JsonRPC协议详解(协议介绍、请求示例、响应示例)
JsonRPC协议详解 文章目录 JsonRPC协议详解什么是RPC?什么是JsonRPC?JsonRPC详解请求示例响应示例成功和失败响应示例参数的数据类型 结束语 什么是RPC? RPC(远程过程调用)是一种用于实现分布式系统中不同进程或不同计…...
系列六、Spring整合单元测试
一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean,那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解,即可在类中注入自己想要测试…...
如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控
平时见ORACLE 19c rac single dg的部署很多了,ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去,让EM13C 来实现对RACDG的监控,主要是DG的EM13C的监控,还没有看到,大部分都是直接…...
Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
什么是Go? Go是一个跨平台、开源的编程语言Go可用于创建高性能应用程序Go是一种快速、静态类型、编译型语言,感觉上像动态类型、解释型语言Go由Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google开发Go的语法类似于C Go用于什么? Web开发&…...
后缀数组
后缀数组感觉有点不好解释,简单记录一下板子。 后缀数组性质 lcp(i, j):指的是第i个后缀以及第j个后缀的最大公共前缀的长度 lcp(i, j) lcp(j, i) lcp(i, i) len(i) lcp(i, j) min(lcp(i, k), lcp(k, j)) 在o(nlogn)的时间复杂度内处理一个字符串ÿ…...
矩阵的初等变换
1.矩阵的初等变换的分类: 1.按类型分:初等行变换(动行),初等列变换(动列) 2.按方式分: 1.交换矩阵的两行或者两列 2.用一个不为0的数乘矩阵的某一行 3.用一个任意的数乘矩阵的某一行…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
