Highcharts 是一个用纯JavaScript编写的一个图表库。

Highcharts 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表

Highcharts 免费提供给个人学习、个人网站和非商业用途使用。

访问官网:

https://www.hcharts.cn/

进入下载页面:

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,就可以得到上面的效果。

它的数据格式一个大的列表,里面每一个元素都是小列表。

列表第一个值,是一个时间戳,第二个是具体的值。打开站长工具的时间戳转换,链接如下:

https://tool.lu/timestamp/

输入数值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

http://127.0.0.1:8000/chart/

页面效果如下:

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

增加黑色主题

打开解压路径,进入目录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使用率的更多相关文章

  1. 搭建自己的博客(十七):添加每日阅读量并使用highcharts通过图表显示

    之前写了单篇博客的阅读量统计,今天添加了博客总阅读量统计,并且使用highcharts图表显示. 1.变化的部分

  2. SQL Server 在task manager里面显示CPU 使用率过高

    发现一篇好文章 https://mssqlwiki.com/2012/10/04/troubleshooting-sql-server-high-cpu-usage/

  3. WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线

    原文:WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshub ...

  4. 让CPU使用率正弦变化

    网络上流传一个面试题,说如何编程让CPU的使用率按照正弦方式变化 代码如下(运行环境Linux): #include <stdio.h> #include <stdlib.h> ...

  5. 利用Highcharts制作web图表学习(一)

    前言:最近项目中需要对数据进行汇总和分析得出柱状图或曲线图这样散装点图,经过学习和测试发现Highchart不错,如果大家项目中需要的话,不妨看看有的例子摘自官网   一.先说说HighCharts的 ...

  6. collectd 检测cpu使用率

    环境配置 1. install epel https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/ 2 ...

  7. WPF 动态模拟CPU 使用率曲线图

    原文:WPF 动态模拟CPU 使用率曲线图      在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改, ...

  8. 制造高CPU使用率的简单方法

    在群里有人问制造CPU占用率高的场景用来做测试.所谓做好事难,干“坏”事还不容易?这个需求有很多方法可以实现,比如使用一些压力测试工具.我首先想 到的是HASH JOIN.这个联接比较消耗CPU资源, ...

  9. [原创小工具]软件内存、CPU使用率监视,应用程序性能监测器 v3.0 绿色版

    应用程序性能监测器 V3.0 更新内容:    1.对一些代码进行了修改,软件本身的性能有所提升. 应用程序性能监测器 V2.0 更新内容:     1.鼠标移动到曲线区域,显示相关的曲线值      ...

随机推荐

  1. python模块——datetime

    datetime模块是python自带对时间的操作,其常用的四大类分别是date.time.datetime.timedelta.下面分别讲解下这四大类中常用的方法及其属性. date类 date类的 ...

  2. java 里没有友元函数怎么办

    我希望一个service可以访问某个对象中的私有对象,但是不希望这个私有对象暴露给其它的service. public xxxServiceImpl{ public void do(){ xxxent ...

  3. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...

  4. redis备忘录

    Redis 是一个基于内存的高性能key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数 ...

  5. 吴裕雄--天生自然 JAVA开发学习:包(package)

    package pkg1[.pkg2[.pkg3…]]; package net.java.util; public class Something{ ... } package animals; i ...

  6. tmp == emg.经典+47

    zw.Y3s3{ttqtf**9q+{xx//up qm+Y3#9t%sfsfqtf+&* hh-Y@15zq&zf51"qt3+x>y ====== 城隍庙 经典景点 ...

  7. 使用 try-with-resources 优雅关闭资源

    桂林SEO:我们知道,在 Java 编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等.redis),我们必须在这些外部资源使用完毕后,手动关闭它们. 因为外部资源不由 JVM 管理,无法享 ...

  8. TPO2-1Desert Formation

    The extreme seriousness of desertification results from the vast areas of land and the tremendous nu ...

  9. PyTorch基础——使用神经网络识别文字中的情感信息

    一.介绍 知识点 使用 Python 从网络上爬取信息的基本方法 处理语料"洗数据"的基本方法 词袋模型搭建方法 简单 RNN 的搭建方法 简单 LSTM 的搭建方法 二.从网络中 ...

  10. fastjon案例

    --json为json串JSONObject obj = JSON.parseObject(json);String x = obj.getString("cropId");JSO ...