django Highcharts制作图表--显示CPU使用率
Highcharts 是一个用纯JavaScript编写的一个图表库。
Highcharts 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表
Highcharts 免费提供给个人学习、个人网站和非商业用途使用。
访问官网:
进入下载页面:
https://www.hcharts.cn/download
下载6.10版本

解压Highcharts-6.1.0.zip文件,访问里面的index.htm文件。
点击Time series, zoomable

页面效果如下:

这个,就是接下来django需要用的模板。
它在目录Highcharts-6.1.0\examples\line-time-series里面,编辑line-time-series目录下的index.htm文件
注意这一行:
'https://cdn.rawgit.com/highcharts/highcharts/057b672172ccc6c08fe7dbb27fc17ebca3f5b770/samples/data/usdeur.json',
它是图表需要的json数据,打开这个json链接,将网页内容复制,使用json格式化工具处理,效果如下:

如果谷歌浏览器,安装插件JSON Formatter,就可以得到上面的效果。
它的数据格式一个大的列表,里面每一个元素都是小列表。
列表第一个值,是一个时间戳,第二个是具体的值。打开站长工具的时间戳转换,链接如下:
输入数值1167609600000,点击转换

很明显,时间不对。为什么呢?因为它是毫秒
选择毫秒,再次点击转换,时间就对了。

那么django需要输出,指定格式的json数据,才能展示正确的图表。
数据从何而来呢?自己造呗!
下面将演示,如何展示一个CPU使用率的图表。
在项目根目录创建文件monit_system.py,它能统计系统的CPU使用率,内存使用情况。
统计完成之后,将对应的数值插入到MySQL中。它会插入30条记录,每隔10秒采集一次。
代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql
import gevent
import time
import psutil #解决wind10错误OSError: raw write() returned invalid length
import win_unicode_console
win_unicode_console.enable() class MyPyMysql:
def __init__(self, host, port, username, password, db, charset='utf8'):
self.host = host # mysql主机地址
self.port = port # mysql端口
self.username = username # mysql远程连接用户名
self.password = password # mysql远程连接密码
self.db = db # mysql使用的数据库名
self.charset = charset # mysql使用的字符编码,默认为utf8
self.pymysql_connect() # __init__初始化之后,执行的函数 def pymysql_connect(self):
# pymysql连接mysql数据库
# 需要的参数host,port,user,password,db,charset
self.conn = pymysql.connect(host=self.host,
port=self.port,
user=self.username,
password=self.password,
db=self.db,
charset=self.charset
)
# 连接mysql后执行的函数
self.asynchronous() def getCPUstate(self,interval=1):
cpu = psutil.cpu_percent(interval)
return cpu def getMemorystate(self):
phymem = psutil.virtual_memory()
cur_mem = phymem.percent
mem_rate = int(phymem.used / 1024 / 1024)
mem_all = int(phymem.total / 1024 / 1024) line = {
'cur_mem': cur_mem,
'mem_rate': mem_rate,
'mem_all': mem_all,
} return line def run(self):
# 创建游标
self.cur = self.conn.cursor()
# 定义sql语句
sql = "insert into blog_system_monit(cpu,cur_mem,mem_rate,mem_all,create_time,time_stamp) values (%s,%s,%s,%s,%s,%s)"
print(sql) # 定义数据
cpu = self.getCPUstate() # cpu使用率
mem = self.getMemorystate() # 内存info信息
mem_rate = mem['mem_rate'] # 内存使用率
cur_mem = mem['cur_mem'] # 当前使用内存
mem_all = mem['mem_all'] # 总内存
struct_time = time.localtime()
create_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time) # 转换为标准时间
t = time.time() # 当前时间戳
time_stamp = int(round(t * 1000)) # 转换为毫秒的时间戳 print((cpu, cur_mem,mem_rate, mem_all,create_time,time_stamp)) # 执行插入一行数据,如果插入多行,使用executemany(sql语句,数据(需一个元组类型))
content = self.cur.execute(sql,(cpu,cur_mem,mem_rate,mem_all,create_time,time_stamp))
if content:
print('插入ok') # 提交数据,必须提交,不然数据不会保存
self.conn.commit() def asynchronous(self):
#执行30次协程任务
for i in range(0,30):
time.sleep(10) # 等待10秒
gevent.spawn(self.run()) # 执行方法 self.cur.close() # 关闭游标
self.conn.close() # 关闭pymysql连接 if __name__ == '__main__':
start_time = time.time() # 计算程序开始时间
st = MyPyMysql('127.0.0.1', 3306, 'root', '', 'db2') # 实例化类,传入必要参数
print('程序耗时{:.2f}'.format(time.time() - start_time)) # 计算程序总耗时
创建表blog_system_monit
进入django项目,修改blog目录下的models.py,内容如下:
from django.db import models # Create your models here.
#必须要继承models.Model类,这个固定写法。
# 这里表示创建表blog_system_monit,blog是应用名,它会自动加上的。
class system_monit(models.Model):
#id自增,类型为bigint。设置为主键
id = models.BigAutoField(primary_key=True)
#类型为decimal(10,2),长度为10,小数点保留2位
cpu = models.DecimalField(max_digits=10, decimal_places=2)
#类型为int(11),11是默认长度
cur_mem = models.IntegerField()
mem_rate = models.DecimalField(max_digits=10, decimal_places=2)
mem_all = models.IntegerField()
#类型为datetime
create_time = models.DateTimeField()
#由于毫秒的时间戳超过了timestamp的长度,所以只能设置bigint了。
time_stamp = models.BigIntegerField()
在Pycharm的Terminal窗口中,输入以下命令
python manage.py makemigrations
python manage.py migrate
执行完成之后,它会自动创建表blog_system_monit
使用pycharm执行脚本monit_system.py,等待5分钟,就会插入30条数据。
如果脚本没有报错,查看表记录,会有30条记录

编辑文件views.py,增加2个视图函数
def chart(request):
#显示html文件
return render(request, "chart.html") def chart_json(request):
#读取表所有记录
system_monit = models.system_monit.objects.all()
data = [] # 创建一个空列表
for i in system_monit: # 遍历,拼横纵坐标
#横坐标为时间戳,纵坐标为cpu使用率。注意,必须转换类型,否则数据不对。
data.append([int(i.time_stamp),float('%.2f' % i.cpu)])
print(data) isdict = json.dumps(data) # json序列化列表
return HttpResponse(isdict, content_type="application/json") # 执行类型为json
修改mysite下的urls.py,新增2个路径
urlpatterns = [
path('admin/', admin.site.urls),
path('chart/', views.chart),
path('chart_json/', views.chart_json),
]
访问json的url
http://127.0.0.1:8000/chart_json/

必须保证格式,和上面cdn.rawgit.com链接的json格式一样。
上的图片是用了JSON Formatter插件展示json数据的效果。
否则下面的步骤不用做了!!!
将line-time-series目录下的index.htm文件复制到django项目的templates目录下,重命名为chart.html
在django项目的static文件夹下,创建目录Highcharts-6.1.0
将Highcharts-6.1.0解压目录中的3个文件,复制到此目录
修改部分代码,大家可以和index.htm对比一下,就知道修改的部分了。完整代码如下:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Highcharts Example</title> <style type="text/css"> </style>
{#配置favicon.ico,解决警告Not Found: /favicon.ico#}
{% load staticfiles %}
<link REL="SHORTCUT ICON" HREF="{% static "images/favicon.ico" %}"/>
</head>
<body>
<script src="../static/js/jquery-3.3.1.min.js"></script>
<script src="../static/Highcharts-6.1.0/highcharts.js"></script>
<script src="../static/Highcharts-6.1.0/modules/exporting.js"></script>
<script src="../static/Highcharts-6.1.0/modules/export-data.js"></script> <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div> <script type="text/javascript">
{#解决显示时间少8小时问题#}
Highcharts.setOptions({global: {useUTC: false}}); $.getJSON(
{#'https://cdn.rawgit.com/highcharts/highcharts/057b672172ccc6c08fe7dbb27fc17ebca3f5b770/samples/data/usdeur.json',#}
'/chart_json/',
function (data) { Highcharts.chart('container', {
chart: {
zoomType: 'x'
},
title: {
text: 'cpu使用率'
},
subtitle: {
text: document.ontouchstart === undefined ?
'单击并拖动绘图区域以放大' : '捏合图表放大'
},
xAxis: {
type: 'datetime', },
{#自定义x坐标信息显示,return部分是用js拼接的,内容可以自己定义。#}
tooltip: {
formatter: function () {
return '<strong>' + this.series.name + ':' + this.y + '%<br/></strong>' +
Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x);
}
},
yAxis: {
title: {
text: '使用率'
}
},
legend: {
enabled: false
},
plotOptions: {
area: {
fillColor: {
linearGradient: {
x1: 0,
y1: 0,
x2: 0,
y2: 1
},
stops: [
[0, Highcharts.getOptions().colors[0]],
[1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
]
},
marker: {
radius: 2
},
lineWidth: 1,
states: {
hover: {
lineWidth: 1
}
},
threshold: null
}
}, series: [{
type: 'area',
name: '百分比',
data: data
}]
});
}
);
</script>
</body>
</html>
项目文件结构如下:
mysite/
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── models.py
│ └── views.py
├── manage.py
├── monit_system.py
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── static
│ ├── css
│ ├── Highcharts-6.1.0
│ │ ├── highcharts.js
│ │ └── modules
│ │ ├── export-data.js
│ │ └── exporting.js
│ ├── images
│ │ └── favicon.ico
│ └── js
│ └── jquery-3.3.1.min.js
└── templates
├── chart.html
├── cur_time.html
├── detail.html
└── index.html
使用pycharm启动django项目,访问url
页面效果如下:

图标支持放大和缩小,可以看到秒级的数据,比如

增加黑色主题
打开解压路径,进入目录Highcharts-6.1.0\code\themes,里面有一个dark-unica.js文件
在static\Highcharts-6.1.0目录下创建目录themes,将dark-unica.js文件复制到此目录
修改char.html文件,在
<script src="../static/Highcharts-6.1.0/modules/export-data.js"></script>
下面一行添加如下代码,导入主题js
{#黑色主题#}
<script src="../static/Highcharts-6.1.0/themes/dark-unica.js"></script>
再次访问网页,效果如下:

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=vcus7uflzabs
转载出处:
http://www.py3study.com/Article/details/id/317.html
django Highcharts制作图表--显示CPU使用率的更多相关文章
- 搭建自己的博客(十七):添加每日阅读量并使用highcharts通过图表显示
之前写了单篇博客的阅读量统计,今天添加了博客总阅读量统计,并且使用highcharts图表显示. 1.变化的部分
- SQL Server 在task manager里面显示CPU 使用率过高
发现一篇好文章 https://mssqlwiki.com/2012/10/04/troubleshooting-sql-server-high-cpu-usage/
- WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线
原文:WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshub ...
- 让CPU使用率正弦变化
网络上流传一个面试题,说如何编程让CPU的使用率按照正弦方式变化 代码如下(运行环境Linux): #include <stdio.h> #include <stdlib.h> ...
- 利用Highcharts制作web图表学习(一)
前言:最近项目中需要对数据进行汇总和分析得出柱状图或曲线图这样散装点图,经过学习和测试发现Highchart不错,如果大家项目中需要的话,不妨看看有的例子摘自官网 一.先说说HighCharts的 ...
- collectd 检测cpu使用率
环境配置 1. install epel https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/ 2 ...
- WPF 动态模拟CPU 使用率曲线图
原文:WPF 动态模拟CPU 使用率曲线图 在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改, ...
- 制造高CPU使用率的简单方法
在群里有人问制造CPU占用率高的场景用来做测试.所谓做好事难,干“坏”事还不容易?这个需求有很多方法可以实现,比如使用一些压力测试工具.我首先想 到的是HASH JOIN.这个联接比较消耗CPU资源, ...
- [原创小工具]软件内存、CPU使用率监视,应用程序性能监测器 v3.0 绿色版
应用程序性能监测器 V3.0 更新内容: 1.对一些代码进行了修改,软件本身的性能有所提升. 应用程序性能监测器 V2.0 更新内容: 1.鼠标移动到曲线区域,显示相关的曲线值 ...
随机推荐
- HDU 1257最少拦截系统[动态规划]
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1257 最 ...
- Unable to cast object of type 'System.String' to type 'System.Int32'.
原因 数据库中 code 字段 类型为 varchar 而实体的类型为 int 导致string 类型无法转化为int 类型而报错 public int code { get; set; } 参考: ...
- Python基础——类new方法与单例模式
介绍: new方法是类中魔术方法之一,他的作用是给类实例化开辟一个内存地址,并返回一个实例化,再由__init__对这个实例进行初始化,故它的执行肯定就是在初始化方法__init__之前了.new方法 ...
- Kruskal算法详解
本章介绍克鲁斯卡尔算法.和以往一样,本文会先对克鲁斯卡尔算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 最小生成树 在含有n个顶点的连通图中选择n-1条边, ...
- 如何写JS库,JS库写法
前言: 现在javascript库特别多,其写法各式各样,总结几种我们经常见到的,作为自己知识的积累.而目前版本的 JavaScript 并未提供一种原生的.语言级别的模块化组织模式,而是将模块化的方 ...
- Python运维中常用的_脚本
前言 file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建.但是更推荐使用内置函数open()来打开一个文件. ...
- tp3中子查询 逻辑条件是or
直接用写sql最快 $map['_string'] = 'status=1 AND score>10'; //子查询条件字段不同 $condition['platform'] = 'swap'; ...
- Linux_打包文件
将多个文件打包成一个大文件,用tar命令 tar是将多个文件前后连接在一起,tar并不对文件进行压缩 tar -cf 要创建的打包文件名(最后加上.tar) 要打包的文件/列表 c代表创 ...
- 使用命令安装laravel 项目
cp .env.example .env 拷贝.env 文件 php artisan key:generate 生成秘钥 php artisan migrate 生成数据表 composer ...
- [从 0 开始的 Angular 生活]No.38 实现一个 Angular Router 切换组件页面(一)
前言 今天是进入公司的第三天,为了能尽快投入项目与成为团队可用的战力,我正在努力啃官方文档学习 Angular 的知识,所以这一篇文章主要是记录我如何阅读官方文档后,实现这个非常基本的.带导航的网页应 ...