当Django遇上Pyecharts将碰撞出怎样的火花……

本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法

Django 模板渲染

1. 新建一个 Django 项目

命令行中输入以下命令

django-admin startproject pyecharts_django_demo

创建一个应用程序

python manage.py startapp demo

创建完之后,在Pycharm 中打开该项目,当然你也可以直接在 Pycharm 中创建

2020-11-06_153700.png

同时在 pyecharts_django_demo/settings.py 中注册应用程序
INSTALLED_APPS 中添加应用程序 demo

pyecharts_django_demo/urls.py 中新增 demo.urls

2. 新建项目 urls 文件

编辑 demo/urls.py 文件,没有就新建一个

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^pie/$', views.ChartView.as_view(), name='demo'),
    url(r'^index/$', views.IndexView.as_view(), name='demo'),
]

3.编写 Django 和 pyecharts 代码渲染图表

由于 json 数据类型的问题,无法将 pyecharts 中的 JSCode 类型的数据转换成 json 数据格式返回到前端页面中使用。

因此在使用前后端分离的情况下尽量避免使用 JSCode 进行画图。

将下列代码保存到 demo/views.py

from django.shortcuts import render

# Create your views here.

import json
from random import randrange

from django.http import HttpResponse
from rest_framework.views import APIView

from pyecharts.charts import Bar, Pie
from pyecharts.faker import Faker
from pyecharts import options as opts


# Create your views here.
def response_as_json(data):
    json_str = json.dumps(data)
    response = HttpResponse(
        json_str,
        content_type="application/json",
    )
    response["Access-Control-Allow-Origin"] = "*"
    return response


def json_response(data, code=200):
    data = {
        "code": code,
        "msg": "success",
        "data": data,
    }
    return response_as_json(data)


def json_error(error_string="error", code=500, **kwargs):
    data = {
        "code": code,
        "msg": error_string,
        "data": {}
    }
    data.update(kwargs)
    return response_as_json(data)


JsonResponse = json_response
JsonError = json_error


def pie_base() -> Pie:
    c = (
        Pie()
            .add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
            .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
            .set_global_opts(title_opts=opts.TitleOpts(title="Pie-示例"))
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
            .dump_options_with_quotes()
    )
    return c

class ChartView(APIView):
    def get(self, request, *args, **kwargs):
        return JsonResponse(json.loads(pie_base()))

class IndexView(APIView):
    def get(self, request, *args, **kwargs):
        return HttpResponse(content=open("./templates/index.html").read())

4. 编写画图的 HTML 代码

在根目录下新建一个 templates 的文件夹,并在该文件夹下新建一个 index.html 文件

代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
<div id="pie" style="width:1000px; height:600px;"></div>
<script>
    var chart = echarts.init(document.getElementById('pie'), 'white', {renderer: 'canvas'});

    $(
        function () {
            fetchData(chart);
        }
    );

    function fetchData() {
        $.ajax({
            type: "GET",
            url: "http://127.0.0.1:8000/demo/pie",
            dataType: 'json',
            success: function (result) {
                chart.setOption(result.data);
            }
        });
    }
</script>
</body>
</html>

运行之后,在浏览器中打开,效果如下:

定时全量更新图表

前面讲的是一个静态数据的展示的方法,用 Pyecharts 和 Django 结合最主要是实现一种动态更新数据,增量更新数据等功能!

定时全量更新主要是前端主动向后端进行数据刷新,定时刷新的核心在于 HTML 的 setInterval 方法。

那么 index.html 代码就是下面这样的:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="bar" style="width:1600px; height:800px;"></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});

        $(
            function () {
                fetchData(chart);
                setInterval(fetchData, 100);
            }
        );

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:8000/demo/bar",
                dataType: 'json',
                success: function (result) {
                    chart.setOption(result.data);
                }
            });
        }
    </script>
</body>
</html>

同时在 demo/views.py 中,增加并修改代码:

views.py

demo/urls.py中,增加如下代码:

urlpatterns = [
    url(r'^pie/$', views.ChartView.as_view(), name='demo'),
    url(r'^bar/$', views.ChartView.as_view(), name='demo'),
    url(r'^index/$', views.IndexView.as_view(), name='demo'),
]

运行之后,效果如下:

贴一张以前做的图(因为我懒),效果和上面一样

定时增量更新图表

原理一样,先修改 index.html ,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="bar" style="width:1600px; height:800px;"></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
        var old_data = [];
        $(
            function () {
                fetchData(chart);
                setInterval(fetchData, 2000);
            }
        );

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:8000/demo/line",
                dataType: "json",
                success: function (result) {
                    var options = result.data;
                    chart.setOption(options);
                    old_data = chart.getOption().series[0].data;
                }
            });
        }

        function getDynamicData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:8000/demo/lineUpdate",
                dataType: 'json',
                success: function (result) {
                    var options = result.data;
                    old_data.push([options.name, options.value]);
                    chart.setOption({
                        series: [{
                            data: old_data
                        }]
                    });
                }
            });
        }

    </script>
</body>
</html>

细心的你应该可以发现,里面新增了两个请求地址 demo/line, demo/lineUpdate

so,在 urlpatterns 中增加以下路径的匹配

url(r'^line/$', views.ChartView.as_view(), name='demo'),
url(r'^lineUpdate/$', views.ChartView.as_view(), name='demo'),

最后在 views.py 中增加以下代码:

def line_base() -> Line:
    line = (
        Line()
            .add_xaxis(["{}".format(i) for i in range(10)])
            .add_yaxis(
            series_name="",
            y_axis=[randrange(50, 80) for _ in range(10)],
            is_smooth=True,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="动态数据"),
            xaxis_opts=opts.AxisOpts(type_="value"),
            yaxis_opts=opts.AxisOpts(type_="value"),
        )
            .dump_options_with_quotes()
    )
    return line

class ChartView(APIView):
    def get(self, request, *args, **kwargs):
        return JsonResponse(json.loads(line_base())
cnt = 9

class ChartUpdateView(APIView):
    def get(self, request, *args, **kwargs):
        global cnt
        cnt = cnt + 1
        return JsonResponse({"name": cnt, "value": randrange(0, 100)})

运行并打开,效果如下:

后台回复 django 获取代码!

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要实现 Django + Pyecharts + MySQL 前后端分离,需要按照以下步骤进行: 1. 后端 Django + MySQL 的实现 首先,根据需求设计数据库表结构,并使用 Django 自带的 ORM 操作数据库。在 Django 中,可以使用 Django REST framework 进行 API 接口的开发,将数据以 JSON 或 XML 格式返回给前端。 2. 前端 Pyecharts 的实现 在前端页面中,使用 Pyecharts 进行图表的绘制。Pyecharts 是一个基于 Echarts 的 Python 图表库,可以轻松绘制各种类型的图表。需要注意的是,Pyecharts 并不是一个前端框架,而是一种将 Python 代码转换成 JavaScript 代码的工具。 3. 前后端分离的实现 在前后端分离的架构中,前端和后端是分离的两个部分,通过 API 接口进行通信。在 Django 中,可以使用 Django REST framework 进行 API 接口的开发,并将数据以 JSON 格式返回给前端。前端通过 AJAX 调用这些 API 接口,获取数据并绘制图表。 4. 部署 最后,需要将 Django 后端和前端页面部署到不同的服务器上,以实现前后端分离。可以使用 Docker 进行部署,将 Django 应用和前端页面分别打包成 Docker 镜像,并使用 Docker Compose 进行部署管理。 总的来说,实现 Django + Pyecharts + MySQL 前后端分离需要对 DjangoPyecharts、MySQL、Django REST framework 等技术有一定的了解和实践经验。同时,需要注意前后端分离架构的设计和实现,以确保系统的稳定性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全村之希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值