当前位置: 首页 > news >正文

Flask Echarts 实现历史图形查询

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 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分钟的数据采集。

以下是对该代码的概述:

  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,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图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图&#xff0c;能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型&#xff0c;包括折线图、柱状图、饼图、散点…...

【漫谈】信创

近些年来&#xff0c;自主创新绝对是高频词汇。 以往是供应链、芯片领域&#xff0c;现在终于到了信息领域。 近期&#xff0c;从上至下、从中央到地方、从政府到国企&#xff0c;各层面、各行业、各领域都在提及“信创”。 信创是个大工程&#xff0c;从计算机通用处理器、…...

linux wget --no-check-certificate

如果您希望每次使用wget命令时都跳过SSL证书检查&#xff0c;可以将–no-check-certificate参数添加到wget的默认配置文件中。 请按照以下步骤进行操作&#xff1a; vi ~/.wgetrc# 插入内容 check_certificate off保存并关闭文件。 现在&#xff0c;wget命令将在每次使用时自…...

mysql命令行连接数据库

有时项目连接不上数据库&#xff0c;报错鉴权失败&#xff0c;先用mysql工具连接下&#xff0c;容易发现问题。 直接输入mysql看是否已安装&#xff0c;如果没有就安装下。 # 注&#xff1a;直接mysql就行&#xff0c;不用-cli也不用-client&#xff0c;也不用-server&#xf…...

计算机丢失vcomp140.dll是什么意思,如何解决与修复(附教程)

vcomp140.dll缺失的5种解决方法以及vcomp140.dll缺失原因 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll缺失”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;给使用者带来了困扰。本文…...

基于SSM实现的叮当书城

一、系统架构 前端&#xff1a;jsp | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7以上 | mysql | maven 二、代码与数据库 三、功能介绍 01. 系统首页 02. 商品分类 03. 热销 04. 新品 05. 注册 06. 登录 07. 购物车 08. 后台-首页 …...

python基础练习题库实验5

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6058fb4b66994aed838f920f7fe75706.png)题目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是一个基于分布式文件存储的数…...

初始化的内容写到析构函数中。。。。。。。

大概是&#xff0c;把应该在构造函数中初始化的堆栈窗体代码写到了析构函数中。。。。 不是因为没掌握构造/析构&#xff0c;而是。。。。 检查了四十多分钟没检查出来。。 被自己蠢哭。 #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(“原字符串”,“目标字符串”) 返回这个子串的起始索引和结束索引&#xff0c;否则就会返回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.思路 如何将一个堆进行排序&#xff0c;并变成升序&#xff1f;首先&#xff0c;如果要完成升序&#xff0c;那我们可以建立一个大堆&#xff0c;因为大堆可以选出一个最大的值放在堆的最上面&#xff0c…...

【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&#xff1f;什么是JsonRPC&#xff1f;JsonRPC详解请求示例响应示例成功和失败响应示例参数的数据类型 结束语 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计…...

系列六、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解&#xff0c;即可在类中注入自己想要测试…...

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了&#xff0c;ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去&#xff0c;让EM13C 来实现对RACDG的监控&#xff0c;主要是DG的EM13C的监控&#xff0c;还没有看到&#xff0c;大部分都是直接…...

Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较

什么是Go? Go是一个跨平台、开源的编程语言Go可用于创建高性能应用程序Go是一种快速、静态类型、编译型语言&#xff0c;感觉上像动态类型、解释型语言Go由Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google开发Go的语法类似于C Go用于什么&#xff1f; Web开发&…...

后缀数组

后缀数组感觉有点不好解释&#xff0c;简单记录一下板子。 后缀数组性质 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)的时间复杂度内处理一个字符串&#xff…...

矩阵的初等变换

1.矩阵的初等变换的分类&#xff1a; 1.按类型分&#xff1a;初等行变换&#xff08;动行&#xff09;&#xff0c;初等列变换&#xff08;动列&#xff09; 2.按方式分&#xff1a; 1.交换矩阵的两行或者两列 2.用一个不为0的数乘矩阵的某一行 3.用一个任意的数乘矩阵的某一行…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...