为项目新建一个目录,将其命名为django_pyecharts_demo,
在终端中切换到这个目录,并创建一个虚拟环境。
python -m venv django_pyecharts
激活虚拟环境
django_pyecharts\Scripts\activate
要停止使用虚拟环境,可执行命令
deactivate
创建并激活虚拟环境后,就可安装Django
(django_pyecharts)learning_log$ pip install Django pyecharts
Django仅在虚拟环境处于活动状态时才可用。
查看已安装的python库,pip list。
(django_pyecharts) PS E:\python_work\Django\django_pyecharts> pip list
Package Version
------------------- -------
asgiref 3.8.1
Django 5.0.3
djangorestframework 3.15.1
Jinja2 3.1.3
MarkupSafe 2.1.5
pip 22.3
prettytable 3.10.0
pyecharts 2.0.5
setuptools 65.5.0
simplejson 3.19.2
sqlparse 0.4.4
tzdata 2024.1
wcwidth 0.2.13
新建一个项目
django-admin startproject pyecharts_django_demo .
千万别忘了这个句点,否则部署应用程序时将遭遇一些配置问题。如果忘记了这个句点,要删除已创建的文件和文件夹(django_pyecharts除外),再重新运行这个命令。
Django将大部分与项目相关的信息存储在数据库中,因此需要创建一个供Django使用的数据库。
python manage.py migrate
核实Django是否正确地创建了项目。为此,可执行命令runserver。
python manage.py runserver
显示
Starting development server at http://127.0.0.1:8000/
等同
http://localhost:8000/
若要关闭这个服务器,可切换到执行命令runserver 时所在的终端窗口,再按Ctrl + C即可。
如果出现错误消息That port is already in use(指定端口被占用),请执行命令
python manage.py runserver 8001
让Diango使用另一个端口。
在前面打开的终端窗口中应该还运行着runserver。
请再打开一个终端窗口(或标签页),并切换到manage.py所在的目录。激活该虚拟环境,
django_pyecharts\Scripts\activate
再执行命令startapp:
python manage.py startapp demo
在 pyecharts_django_demo/settings.py 中注册应用程序。
# pyecharts_django_demo/settings.py
INSTALLED_APPS = [
'demo',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
编辑 demo/urls.py 文件
# demo/urls.py
from django.urls import include
from django.urls import re_path as url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
在 pyecharts_django_demo/urls.py 中新增 ‘demo.urls’
from django.contrib import admin
from django.urls import path
from django.urls import include
from django.urls import re_path as url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^demo/', include('demo.urls'))
Step 1: 拷贝 pyecharts 模板
先在 demo 文件夹下新建 templates 文件夹,
将 pyecharts 模板,位于 pyecharts.render.templates 拷贝至刚新建的 templates 文件夹,
Step 2: 渲染图表
将下列代码保存到 demo/views.py 中。
from jinja2 import Environment, FileSystemLoader
from pyecharts.globals import CurrentConfig
from django.http import HttpResponse
CurrentConfig.GLOBAL_ENV = Environment(loader=FileSystemLoader("./demo/templates"))
from pyecharts import options as opts
from pyecharts.charts import Bar
def index(request):
c = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
)
return HttpResponse(c.render_embed())
Step 3: 运行项目
python manage.py runserver
使用浏览器打开 http://127.0.0.1:8000/demo 即可访问服务
Django 前后端分离
Step 0: 建立文件夹、虚拟环境等,前几步同上。
Step 1: 新建一个 Django 项目
django-admin startproject pyecharts_django_demo .
python manage.py migrate
python manage.py startapp demo
在 pyecharts_django_demo/settings.py 中注册应用程序
# pyecharts_django_demo/settings.py
INSTALLED_APPS = [
'demo', # <--- app 名称
'rest_framework',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
在 pyecharts_django_demo/urls.py 中新增 ‘demo.urls’
# pyecharts_django_demo/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include
from django.urls import re_path as url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^demo/', include('demo.urls'))
]
编辑 demo/urls.py 文件(没有就新建一个)
from django.urls import include
from django.urls import re_path as url
from . import views
urlpatterns = [
url(r'^bar/$', views.ChartView.as_view(), name='demo'),
url(r'^index/$', views.IndexView.as_view(), name='demo'),
]
Step 2 编写画图 HTML 代码
先在根目录文件夹下新建 templates 文件夹,新建一个 index.html
(django_pyecharts) PS E:\python_work\Django\django_pyecharts_demo> ls
目录: E:\python_work\Django\django_pyecharts_demo
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/3/24 14:08 demo
d----- 2024/3/24 9:43 django_pyecharts
d----- 2024/3/24 14:06 pyecharts_django_demo
d----- 2024/3/24 9:53 templates
-a---- 2024/3/24 9:45 131072 db.sqlite3
-a---- 2024/3/24 9:45 699 manage.py
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:1000px; height:600px;"></div>
<script>
var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
$(
function () {
fetchData(chart);
}
);
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>
Step 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
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 bar_base() -> Bar:
c = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [randrange(0, 100) for _ in range(6)])
.add_yaxis("商家B", [randrange(0, 100) for _ in range(6)])
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
.dump_options_with_quotes()
)
return c
class ChartView(APIView):
def get(self, request, *args, **kwargs):
return JsonResponse(json.loads(bar_base()))
class IndexView(APIView):
def get(self, request, *args, **kwargs):
return HttpResponse(content=open("./templates/index.html").read())
Step 4: 运行项目
python manage.py runserver
使用浏览器打开 http://127.0.0.1:8000/demo/index 即可访问服务。