CodeSalt | Django + Echarts 实例

渗透测
• 阅读 14051

CodeSalt | Django + Echarts 实例

由于近期需要熟悉Django、Echarts,因此通过本文记录实现Django + Echarts 两个小实例的过程,将分别使用不同方式实现Web端Echarts图表的展示:

  1. 使用pyecharts展示3D图
  2. 使用echarts.js展示折线图
  3. 后续Django在连接MySQL进行展示时可能遇到的一些问题
0 前期准备
  • 环境+Django准备

    • 虚拟环境

      • 使用指定版本Python(本文使用python3.5),创建名为djangovenv的虚拟环境

        • $ virtualenv --python=/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 djangovenv
      • 激活虚拟环境

        • $ source ~/venv/djangovenv/bin/activate
      • 安装Django 1.11.4pyecharts

        • $ pip install django==1.11.4
        • $ pip install pyecharts
      • 创建Django ProjectDjango App

        • 创建名为mychartsite的Project

          • $ django-admin startproject myechartsite
        • 进入刚才创建的project目录$ cd my echartsite
        • 创建名为djoncharts的app

          • $ python manage.py startapp djoncharts
      • 注册app,在myechartsite/settings.py中注册
          INSTALLED_ APPS = [
      'djoncharts', # <----在此添加
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      ]

1 使用pyecharts
  • 安装

    • $ pip install pyecharts

Demo制作(不与数据库连接,直接来看一个官方样例的效果,3D图)

  • Step1: 在app目录下设置myechartsite/djoncharts/urls.pymyechartsite/djoncharts/views.py

    首先,设置djoncharts/urls,app命名空间有助于让后续模板中{% url %}标签区分应该为URL创建哪个应用的视图

    # myechartsite/djoncharts/urls.py
    
    from django.conf.urls import url
    from . import views
    
    app_name = 'djoncharts'
    urlpatterns = [
       url(r'^pyechart3d/$', views.pyechart3d, name='pyechart3d'),
    ]

    之后,处理视图(Views)功能部分,设置djoncharts/views
    将pyecharts的官方案例写入views:

    # myechartsite/djoncharts/views.py
    
    from __future__ import unicode_literals
    from django.shortcuts import render
    import math
    from django.http import HttpResponse
    from django.template import loader
    from pyecharts import Line3D
    
    from pyecharts.constants import DEFAULT_HOST
    
    
    def pyechart3d(request):
        template = loader.get_template('djoncharts/pyecharts.html')
        l3d = line3d()
        context = dict(
            myechart=l3d.render_embed(),
            host=DEFAULT_HOST,
            script_list=l3d.get_js_dependencies()
        )
        return HttpResponse(template.render(context, request))
    
    
    def line3d():
        _data = []
        for t in range(0, 25000):
            _t = t / 1000
            x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t)
            y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t)
            z = _t + 2.0 * math.sin(75 * _t)
            _data.append([x, y, z])
        range_color = [
            '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',
            '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
        line3d = Line3D("3D line plot demo", width=1200, height=600)
        line3d.add("", _data, is_visualmap=True,
                   visual_range_color=range_color, visual_range=[0, 30],
                   is_grid3D_rotate=True, grid3D_rotate_speed=180)
        return line3d
  • Step2: 为项目提供自己的模板
    (上述代码中 template = loader.get_template('djoncharts/pyecharts.html')还找不到我们的模板)

首先,在app(/djoncharts)目录下,创建模板/templates以及子目录/templates/djoncharts ,在此子目录下创建pyecharts.html

创建完成后的目录结构为:

├── __init__.py
├── admin.py
├── apps.py
├── tests.py
├── models.py
├── templates/
│   └── djoncharts/
│       └── pyecharts.html
├── views.py
├── migrations/
│   ├── __init__.py
├── urls.py

将下面 html 模板代码保存为pyecharts.html,确保 pyecharts.html 文件的绝对路径为 myechartsite/djoncharts/templates/djoncharts:

<!-- myechartsite/djoncharts/templates/djoncharts/pyecharts.html -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Proudly presented by PycCharts</title>
    {% for jsfile_name in script_list %}
    <script src="{{host}}/{{jsfile_name}}.js"></script>
    {% endfor %}
</head>

<body>
  {{myechart|safe}}
</body>

</html>
  • Step3: 将根目录下的URLconf指向djoncharts.urls模块;按照django文档的指示,我们任何时候都应该使用include()来导入其他URL模式。(admin.site.urls是唯一一个例外)
# myechartsite/urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^djoncharts/', include('djoncharts.urls')),
]
  • Step4: 运行项目

    `$ cd myechartsite`
    `$ python manage.py runserver`
    在浏览器输入:`http://127.0.0.1:8000/djoncharts/pyecharts`
    

    CodeSalt | Django + Echarts 实例


2 使用echarts(不使用pyecharts库)

优点在于可个性化灵活定制页面。

  • 安装可直接前往官网下载即可

Demo制作(不与数据库连接,直接看一个官方样例的效果,折线图)

在上一个demo里面,我们已经在根目录的URLconf设置了指向djoncharts的urlpatterns, 因此不用管根目录的urls

  • Step1: 在app目录下的urls.py中添加新的url(),绑定zhexian()视图函数:

    # myechartsite/djoncharts/urls.py
    
    urlpatterns = [
    ...
    
       url(r'^zhexian/$', views.zhexian, name='zhexian'),
    ]
  • Step2: 在views.py中添加zhexian()视图函数:

    # myechartsite/djoncharts/views.py
    def zhexian(request):
        return render(request, 'djoncharts/zhexian.html')
  • Step3: 导入echarts.js并添加模板zhexian.html

    首先,导入echarts.js:创建目录static/djoncharts/js,复制echarts.js至目录下(确保echarts.js在绝对路径/myechartsite/djoncharts/static/djoncharts/js/echarts.js 下)

    之后,添加模板,将以下代码写入templates/djoncharts/zhexian.html

    {% load static %} 
    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <!-- 引入 ECharts 文件 使用 static 关键字-->
        /
        <script src="{% static 'djoncharts/js/echarts.js' %}"></script>
    
    </head>
    </html>
    <body>
        <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
        <div id="main" style="width:1280px;height:850px;"></div>
        <script type="text/javascript">
    
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));
    
            // 指定图表的配置项和数据
            var option = {
                    title: {
                        text: 'Step Line'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data:['Step Start', 'Step Middle', 'Step End']
                    },
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    toolbox: {
                        feature: {
                            saveAsImage: {}
                        }
                    },
                    xAxis: {
                        type: 'category',
                        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            name:'Step Start',
                            type:'line',
                            step: 'start',
                            data:[120, 132, 101, 134, 90, 230, 210]
                        },
                        {
                            name:'Step Middle',
                            type:'line',
                            step: 'middle',
                            data:[220, 282, 201, 234, 290, 430, 410]
                        },
                        {
                            name:'Step End',
                            type:'line',
                            step: 'end',
                            data:[450, 432, 401, 454, 590, 530, 510]
                        }
                    ]
    };
            
            // 使用刚指定的配置项和数据显示图表
            myChart.setOption(option);
        </script>
    </body>
    
  • Step4: 运行项目

    $ cd myechartsite
    $ python manage.py runserver
    在浏览器输入:http://127.0.0.1:8000/djoncharts/zhexian

    CodeSalt | Django + Echarts 实例


3 后续Django在连接MySQL进行展示时可能遇到的一些问题
  • 3.1 如何操作数据库(两种方式)

    • 1 执行cursor()

      cur = connections['databasename'].cursor()
      cur.execute('''
               SQL语句
               ''')
      # 转换成dataframe
      df = pd.DataFrame(list(cur.fetchall()),
                        columns=['name','song'])
    • 2 通过模型,操作模型

      • 安装pymysql

        • python3.5不支持MySQL-python所以需要换成pymysql
        • 安装后在/myechartsite/myechartsite/__init.py下输入

          import pymysql
          pymysql.install_as_MySQLdb()
      • 准备models

        • 若没设置default的数据库,所以需要加--database=来指定一个。因此使用$ python manage.py inspectdb --database=yourdatabasename查看相应的数据库表的模型
        • 可以通过$ python manage.py inspectdb --database=afant_stat_db > djoncharts/models.py将模型文件写入对应app下的models.py文件
  • 3.2 在视图函数中测试执行SQL语句时候报错

    • 解决方法:
    • os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myechartsite.settings")
  • 3.3 template中如何取dict值

    • 使用循环来取{% for key, value in dict.items %}
  • 3.4 template中dict无法排序问题,

    • 使用{{ for key, value in dict.items|dictsort:0 }}针对给定的index (此处是0,所以就是依据key) 进行过滤
<body>
        {% for k, v in pre_stat.items|dictsort:0 %}
                {% if k %}
                    {{ k }}
                    {{ v }}
                {% else %}
                    <p> nothing to show </p>
                {% endif %}
        {% endfor %}
</body>

(另外也可自行写templatetag函数来进行dict过滤)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
达里尔 达里尔
3年前
在Vue项目里遇到多次渲染echart组件只显示一个的问题
症状vue项目echarts中出现“Thereisachartinstancealreadyinitializedonthedom.”的警告Vue页面多次渲染echarts封装的组件但只出现一个(如果这个为主要症状)原因:1.有可能是id冲突,如果你注册了N个组件,但是由于是复制粘贴过来的,导致你所有的组件文件echarts容器
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
马丁路德 马丁路德
4年前
微信小程序---使用Echarts和分包
微信小程序中使用Echarts和分包假期虽然结束了,但是它以另外一种形式展示我们身上(摸摸自己的小肚子)。在小程序上以图形化显示数据就是分给我的假期预研任务,查了一下网上大佬们的文章了解到了Ucharts,F2,Wxcharts和Echarts,只尝试了F2和Echarts,由于Echarts的最近更新最近和我对Echa
Stella981 Stella981
3年前
ECharts 的拖拽小扩展
今天给大家介绍echarts中一个小例子『拖拽改变图表』的实现。这个例子是在原生echarts基础上做了些小小扩展,带有一定的交互性。通过这个例子,我们可以了解到,如何使用echarts提供的API实现『定制化的』『富有交互的』功能。!(http://timg01.bdimg.com/timg?pacompress&imgtype3
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Ionic2 集成ECharts
在群里看到有人问怎么在Ionic2中集成ECharts来显示图表。当时答应说写个blog,简单写下步骤。在TypeScript中如果要使用第三方库,必须要有d.ts,也就是定义文件,没有这个文件的话TypeScript是认不出来的,无法编译通过。下面以百度的ECharts图表为例,演示一下使用第三方库的用法。1、安装ECHARTS首先需要使用np
Wesley13 Wesley13
3年前
dhm
<centerdhmecharts</center    echarts3图表封装,前台ajax通过自定义div属性实现传值,后台通过各种数据适配器自动组装达到图表封装,以实现echarts图表展示,也可以自定义适配器。以及分析预测echarts图表拟合曲线算法。项目地址:https:
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
渗透测
渗透测
Lv1
回忆总是会打我一个巴掌指着旧的伤疤不准我遗忘
文章
3
粉丝
0
获赞
0