在阿里云服务器上搭建django+pyecharts的总结

引言:

本篇文章的实现效果如下图。用django和pyechart实现将图表显示在网页中。

《在阿里云服务器上搭建django+pyecharts的总结》

  1. 环境创建:

推荐在虚拟环境下进行Django等软件的安装。因为使用方便,和其他的版本不冲突。

用pip进行安装,pip3的意思是基于python3的pip。

pip3 install virtualenv
创建虚拟环境
$ virtualenv --no-site-packages pyecharts-env

终端输出如下,pyecharts-env文件夹就是虚拟环境文件夹。使用虚拟环境需要激活。

《在阿里云服务器上搭建django+pyecharts的总结》

激活虚拟环境
$ source pyecharts-env/bin/activate

需要注意的是,激活虚拟环境之后的话,命令行前面多个虚拟环境的名字。如下图,

《在阿里云服务器上搭建django+pyecharts的总结》

安装django和pyecharts
$ pip install django==1.11.4
$ pip install pyecharts
新建 django 项目
$ django-admin startproject myechartsite
新建应用程序
$ python manage.py startapp myfirstvis

以上完成后,查看目录结构如下,

《在阿里云服务器上搭建django+pyecharts的总结》

在 myechartsite/settings.py 中注册应用程序

# myechartsite/settings.py

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myfirstvis'  # <---
]

先编辑 urls.py.这文件在 Django 里的功能是把前段的 HTTP 需求和后台服务函数挂钩。

注意,下面修改的是两个文件。

# myfirstvis/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.index, name='index'),
]
#-------------------------------------------------------------------

#在 myechartsite/urls.py 中新增 'myfirstvis.urls'
#myechartsite/urls.py

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'myfirstvis/', include('myfirstvis.urls'))  # <---
]

2.处理视图功能部分

容易被忽略的部分来了。网上很多关于这部分的写法是下面这样的,这样是不对的。如果这样写,后面会报错。“from pyecharts.constants import DEFAULT_HOST”。

所以啊,一定不要这样写。按照下面注释修改就可以了。

#myfirstvis/views.py

from __future__ import unicode_literals
import math
from django.http import HttpResponse
from django.template import loader
from pyecharts import Line3D
#from pyecharts.constants import DEFAULT_HOST #这句去掉
REMOTE_HOST = " #加上这句
 
def index(request):
    template = loader.get_template('myfirstvis/pyecharts.html')
    l3d = line3d()
    context = dict(
        myechart=l3d.render_embed(),
        #host=DEFAULT_HOST,#这句改为下面这句
        host=REMOTE_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

script_list 是 Page() 类渲染网页所需要依赖的 echarts js 库,依赖的库的数量取决于所要渲染的图形种类。

host 是 echarts js 库的地址,默认提供的地址为 https://pyecharts.github.io/assets/js 当然,如果你愿意你也可以改变这个地址,先克隆 https://github.com/pyecharts/assets 然后将 js 文件夹挂载在你自己的服务器上即可。(笔者:这个挂载我还没有尝试,等有时间看看。因为完成后,默认的访问速度很慢,不知道是服务器的问题,还是由于js文件夹没有放在本地的问题。)

3.为项目提供自己的模板

创建文件夹  templates/myfirstvis 。

$ mkdir templates/myfirstvis -p

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

<!-- myfirstvis/templates/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>

4. 运行项目

在运行之前,先检查一下各个文件路径是否与我一样。

├── myechartsite
│   ├── db.sqlite3
│   ├── manage.py
│   ├── myechartsite
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── myfirstvis
│       ├── admin.py
│       ├── apps.py
│       ├── __init__.py
│       ├── migrations
│       ├── models.py
│       ├── __pycache__
│       ├── templates
│       ├── tests.py
│       ├── urls.py
│       └── views.py

好了,开始运行。

$ cd myechartsite
$ python manage.py runserver

上面命令的默认端口是8000,可以指定端口号运行,如下。

python manage.py runserver 0.0.0.0:8888

终端输出如下,这时就可以打开浏览器来查看效果了。

地址:http://你的服务器IP:8888/myfirstvis/    

(如果是本地电脑,就是 http://127.0.0.1:8888/myfirstvis/ )

《在阿里云服务器上搭建django+pyecharts的总结》

到这里就完成了。


可能遇到的问题:

  1. 如果访问失败,查看一下阿里云的安全组里面是否把端口加上。

    《在阿里云服务器上搭建django+pyecharts的总结》

    《在阿里云服务器上搭建django+pyecharts的总结》

  2. 上面代码中“from __future__ import unicode_literals”这句一定要放在那个文件的开头第一句,具体哪个文件见上面代码。不放在第一句,会报错。

  3. 报错“You may need to add ‘47.93.9.14’ to ALLOWED_HOSTS.”

    原因与修改:

    1,以上时我访问请求的时候出现的,原因在于Django框架中的创建的一个项目的时候,

    2,跑下这个命令:python manage.py runserver 10.211.55.5:8000

    3,然后在我本机的浏览器中写入上述IP和端口请求过去:http://10.211.55.6:8000

    4,于是就出现了最上面的那个问题;

    5,于是就去django-admin.py startproject project-name创建的项目中去修改 setting.py 文件:ALLOWED_HOSTS = [‘*’]  #在这里请求的host添加了*

    6,于是就成功的访问到了Django的项目了;

点赞