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分钟的数据,采集到的数据如下图所示;

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

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

相关文章

[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效

文章目录 Spring 如何解决循环依赖问题resource 与 autowire 同时存在时谁生效 Spring 如何解决循环依赖问题 Spring在实例化一个bean的时候&#xff0c;是首先递归实例化其所依赖的所有bean&#xff0c;直到某个bean没有依赖其他bean&#xff0c;此时就会将该实例返回&#x…

【JavaWeb】Servlet

Servlet 文章目录 Servlet一、简介二、开发流程三、生命周期四、ServletConfig和ServletContext五、HttpServletRequest常见API六、HttpServletResponse常见API七、请求转发和响应重定向7.1 概述7.2 请求转发7.3 响应重定向 八、请求与响应乱码问题8.1 GET与POST请求乱码8.2 响…

内网穿透的应用-Jupyter Notbook+cpolar内网穿透实现公共互联网访问使用数据分析工作

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

五、Lua流程控制与函数

一、流程控制 &#xff08;一&#xff09;含义 Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码&#xff0c;在条件为 false 时执行其他指定代码。 &#xff08;二&#xff09;原型 if (成立) then执行体1else执行体2 end…

字符串入门算法题!

概述 字符串和数组一样算是比较简单的题目&#xff0c;正适合打算法基础&#xff0c;一定要认真对待&#xff01;&#xff01;&#xff01; 字符串类型的算法问题可以分为简单、中等和困难的难度级别&#xff0c;基础类型一些基本的字符串处理问题&#xff0c;如字符串的拼接…

自动化部署 扩容openGauss —— Ansible for openGauss

前言 大家好&#xff0c;今天我们为大家推荐一套基于Ansible开发的&#xff0c;自动化部署及扩容openGauss的脚本工具&#xff1a;Ansible for openGauss&#xff08;以下简称 AFO&#xff09;。 通过AFO&#xff0c;我们只需简单修改一些配置文件&#xff0c;即可快速部署多种…

数智赋能 锦江汽车携手苏州金龙打造高质量盛会服务

作为一家老牌客运公司&#xff0c;成立于1956年的上海锦江汽车服务有限公司&#xff08;以下简称锦江汽车&#xff09;&#xff0c;拥有1200多辆大巴和5000多辆轿车&#xff0c;是上海乃至长三角地区规模最大的专业旅游客运公司。面对客运市场的持续萎缩&#xff0c;锦江汽车坚…

王道数据结构课后代码题p19 第14题请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c) 中的最小距离。(c语言代码实现)

本题其实就是找a到c的最小值 有讲解p19 第14题 c语言实现王道数据结构课后代码题_哔哩哔哩_bilibili 下方有图&#xff1a; 本题代码如下 int abs(int a)//计算绝对值 {if (a < 0)return -a;elsereturn a; } int min(int a, int b, int c)//a是否为三个数中的最小值 {if …

基于xml配置的AOP

目录 xml方式AOP快速入门 xml方式AOP配置详解 xml方式AOP快速入门 xml方式配置AOP的步骤 导入AOP相关坐标 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></de…

二叉树题目:结点与其祖先之间的最大差值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;结点与其祖先之间的最大差值 出处&#xff1a;1026. 结点与其祖先之间的最大差值 难度 5 级 题目描述 要求 给…

无人售货奶柜:方便快捷,新鲜畅享

无人售货奶柜&#xff1a;方便快捷&#xff0c;新鲜畅享 无人售货奶柜&#xff0c;便捷、多样、实时监控。随时选择您喜爱的奶制品和饮料&#xff0c;快速支付&#xff0c;满足个性口味。24小时全天候运营&#xff0c;无时间限制&#xff0c;随时满足您的购物需求。借助先进的技…

在Rust中编写自动化测试

1.摘要 Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:1.设置任何所需的数据或状态;2.运行需要测试的代码;3.断言其结果是我们所期望的。本篇文章主要探讨了Rust自动化测试的几种常见场景。 2.测试函数详解 在Rust项目工…

使用Python编写数独游戏Sudoku教程

数独是各种应用程序中流行的益智类拼图游戏。数独板是一个99的网格&#xff0c;玩家必须在每行、每列和33的子网格中放置一次数字1到9&#xff0c;并且只能放置一次。游戏开始时&#xff0c;有几个空格已经用数字填充&#xff0c;称为givens。一个好的数独谜题应该只有一个可能…

Linux MeterSphere一站式开源持续测试平台远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

计算机毕业设计 基于SpringBoot的智能停车场计费系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

linux下的工具---yum

一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…

IDEA中Tomcat启动web项目

1.首先【Run】-->【Edit Configurations】&#xff0c;进入对应功能界面 2.点击左上角【】&#xff0c;选择Tomcat Server -->Local 3.Name输入自己中意的&#xff0c;下面两个port&#xff0c;保证没被占用就行 4.切到【Deployment】页签&#xff0c;点击【】&#xff…

(十三)Flask之特殊装饰器详解

目录&#xff1a; Flask中用作装饰器的特殊的函数第一部分&#xff1a;before_request和after_request一、 before_request装饰器&#xff1a;二、after_request装饰器&#xff1a;三、多个before_request和after_request执行流程分析&#xff1a; 首先—理论讲解&#xff1a;然…

Python3 面向对象

面向对象技术简介 类&#xff08;Class&#xff09;&#xff1a;用来描述具有相同属性的方法和对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法&#xff1a;类中定义的函数类变量&#xff1a;类变量在整个实例化的对象中是公用的。类变量定义在…

微软Azure AI新增Phi、Jais等,40种新大模型

微软在官方宣布在Azure AI云开发平台中&#xff0c;新增了Falcon、Phi、Jais、Code Llama、CLIP、Whisper V3、Stable Diffusion等40个新模型&#xff0c;涵盖文本、图像、代码、语音等内容生成。 开发人员只需要通过API或SDK就能快速将模型集成在应用程序中&#xff0c;同时支…