为什么要用Django

日常业务过程里面,我们组织各种各样的分析,会经历接收需求、采集数据到分析结果呈现的流程,当固定模板形成周期性报告时,Excel/PPT已经不能满足自动更新的需求。在缺乏完善的BI平台情况下,Django能够承载部分数据产品的功能,实现数据的可视化呈现。

搭建Django需要预备哪些知识

搭建django需要具备一些一定的知识储备,以及足够多的耐心。

首先,最最最大的前提是,你必须要了解python,并且能够运用对数据进行操作处理。 然后需要了解一部分数据库方面的使用技巧,知道怎么写SQL。 再之后需要了解一部分HTML的语法规则,能够区分基础的标签类型。 如果要实现网页数据的自动更新,可能还需要了解一下js、ajax方面的知识。 最后,要实现供其他人远程访问,就需要了解服务器以及部署,完成任务的定时运行。

Django的搭建路线

1. django安装和环境变量配置

python安装django相关模块



cmd> pip install django
cmd> # windows安装完成后,添加环境变量:
cmd> # C:Python37Libsite-packagesdjangobin;
cmd> # 如果是通过anaconda安装,环境变量会自动添加;
cmd> # linux/mac可以不考虑环境变量的设置;



2. python启动django

2.1. 创建第一个项目

打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入这些命令(不是 python 的 shell中)

如果是 windows 用 cmd(开始 搜索 cmd 或者快捷键win+R,输入cmd 直接在 cmd上操作。



cmd> django-admin.py startproject project_name
cmd> # 注意:在windows上如果启动错误,尝试用django-admin代替django-admin.py试试;
cmd>
cmd> django-admin startproject zwl
cmd> # project_name为自定义,示例项目为zwl



2.2. 创建第一个APP



cmd> cd zwl
cmd> # 进入项目文件夹,并创建第一个应用
zwl> django-admin startapp supcon
zwl> tree /f
zwl> # 如果是在mac或者linux需要预装tree,且中文目录为tree -N
zwl> # linux下安装tree的命令,sudo apt-get install tree



此时,在工作目录下的文件结构如下图所示




django html页面运行python脚本 python怎么运行html_django


zwl> # 此时一个django的项目就已经搭建好了,查看是否成功
zwl> python manage.py runserver
zwl> # 在运行时可以添加自定义端口,如python manage.py runserver 8008
zwl> # 通过浏览器访问127.0.0.1:8000,可以查看结果
zwl> # 中断快捷键:ctrl+c


浏览器访问结果


django html页面运行python脚本 python怎么运行html_django_02


在启动时,由于版本的原因可能会出现以下两个错误 - 错误1:mysql中base.py脚本vesion错误


cmd> python manage.py makemigrations
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
解决方案:
D:Program FilesPythonlibsite-packagesdjangodbbackendsmysqlbase.py
中的两句注释掉
# if version < (1, 3, 13):
#     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)


  • 错误2:mysql中operations.py脚本编码错误
cmd> python manage.py makemigrations
AttributeError: 'str' object has no attribute 'decode'
解决方案:
D:Program FilesPythonlibsite-packagesdjangodbbackendsmysqloperations.py
中的If判断注释掉
# if query is not None:
#     query = query.decode(errors='replace')


3. 调整项目中关于数据库的配置

3.1. 在mysql中建库


cmd> net start mysql
cmd> # 如果mysql没有启动,则需要提前启动
cmd> mysql -u root -p
cmd> Enter password:
mysql> show databases;


django html页面运行python脚本 python怎么运行html_python_03


mysql> # 查看已有数据库,可直接利用,如果没有,则需要创建
mysql> CREATE DATABASE supcon DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> # 建库一定要改编码为utf8!!!否则后续使用中文编码可能会报错
;
mysql> # 如果建库时没有设定编码集,可以通过下面语句进行更改
mysql> show variables like '%char%';
mysql> #查看字符集编码
mysql> alter database <数据库名> character set utf8mb4;
mysql> # 例:alter database db_user character set utf8mb4;
mysql> alter table <表名> character set utf8mb4;
mysql> # 例:alter table user character set utf8mb4;
mysql> ALTER TABLE <表名> MODIFY COLUMN <字段名> <字段类型> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> # 例:ALTER TABLE comment MODIFY COLUMN content VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


3.2. 设置settings中的数据库

在项目文件夹中找到settings.py文件,打开编辑

zwl/settings.py初始化内容:


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


zwl/settings.py修改为:


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # Add 'postgresql_psycopg2','mysql', 'sqlite3' or 'oracle'
        'NAME': 'supcon',  # Your db name, Or path to database file if using sqlite3
        'USER': 'root',  # Your db user name, Not used with sqlite3
        'PASSWORD': '',  # Your db password, Not used with sqlite3
        'HOST': '127.0.0.1',  # Your db host, set to empty string('') for default for localhost,  Not used with sqlite3
        'PORT': '3306'  # Your db port, set to empty string('') for default, Not used with sqlite3
    }
}


在项目文件夹中找到init.py文件,初始化没有内容,需要添加下面两句,调用pymysql包,使django和数据库能够进行ORM操作。

zwl/init.py文件中添加:


import pymysql
pymysql.install_as_MySQLdb()


在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。用面向对象的方式去操作数据库的创建表、增加、修改、删除、查询等操作。把面向对象中的类和数据库表一一对应,通过操作类和对象,对数据表实现数据操作,不需要写sql,由orm框架生成。

3.2. 通过models关联数据库表

在配置完settings.py后,进入到应用文件夹内找到models.py文件,打开编辑,添加创建第一个模型

supcon/models.py中添加


class BiPerson(models.Model):
    name = models.CharField(max_length=64, blank=True, null=True)
    person_id = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'bi_person'


编辑完成后,进入终端/cmd窗口下执行数据迁移,实现python类和mysql数据库表之间的映射


zwl> python manage.py makemigrations
zwl> # 执行数据迁移
zwl> python magage.py migrate
zwl> # 同步表结构


此时,在mysql中会创建一张bi_person的表,可通过Navicat进行查看

3.3. 如何获取数据库中的表数据

前面的操作都是在终端/cmd中进行操作的,在查看数据库数据时,需要进入到Python的ide中执行下面的语句


# python console
# 导入相关的模块、工具
from BIDashboard.models import BiPerson
from django.core.serializers import serialize

# 可查看表相关数据,格式为queryset
BiPerson.objects.all().values()
Out[1]: <QuerySet [{'id': 1, 'name': '夏天', 'person_id': 1}, {'id': 2, 'name': '西索', 'person_id': 2}, {'id': 3, 'name': '蜗牛', 'person_id': 3}]>

# 如果需要进行字段筛选,可以在values中取出对应的字段
BiPerson.objects.all().values('id','name')
Out[2]: <QuerySet [{'id': 1, 'name': '夏天'}, {'id': 2, 'name': '西索'}, {'id': 3, 'name': '蜗牛'}]>

# 可通过serialize讲queryset转换成为json格式
mapdata=BiPerson.objects.all()
mapdata_json=serialize("json", mapdata,ensure_ascii=False)
Out[3]: '[{"model": "BIDashboard.biperson", "pk": 1, "fields": {"name": "夏天", "person_id": 1}}, {"model": "BIDashboard.biperson", "pk": 2, "fields": {"name": "西索", "person_id": 2}}]'


另外一种获取数据的方式是直接利用pymysql通过sql的方式进行查询


# python console
from django.db import connection
sql='select * from bi_person'
cur = connection.cursor()
cur.execute(sql)
cur.fetchall()
Out[4]: 
((1, '夏天', 1),
 (2, '西索', 2),
 (3, '蜗牛', 3)


4. 搭建属于自己的第一个页面

经过前面3个步骤,基本的过程已经配置完成,接下来开始搭建第一个页面。在这之前,结构树中只有项目(zwl)和应用(supcon)两层文件夹,还需要创建一个templates文件夹,可以直接创建也可以通过命令创建


zwl>mkdir templates
zwl>tree /f # linux是tree -N


4.1. 编写自己的第一个网页

进入到templates文件夹下创建一个HTML5页面:first.html,编辑

templates/first.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>示例网站</title>
</head>
<body>
    <p>这是我的第一个网页</p>
</body>
</html>


4.2. 建立视图和html的映射

进入到supcon/views.py中创建一个类,通过render连接templates中的HTML5文件

supcon/views.py


from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse,JsonResponse
from supcon.models import BiPerson
def test(request):
    return render(request,'first.html')


4.3. 配置网站路由

在zwl/urls.py中进行编辑,通过urlpatterns中的path对访问路径进行指定

zwl/urls.py


from django.contrib import admin
from django.conf.urls import url
from zwl import settings
from supcon import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/',views.test),
    ]


4.4. 查看网页

进入终端/cmd,启动服务


zwl> python manage.py runserver
zwl> # 在运行时可以添加自定义端口,如python manage.py runserver 8008
zwl> # 通过浏览器访问127.0.0.1:8000,可以查看结果
zwl> # 中断操作快捷键:ctrl+c


在浏览器中访问:127.0.0.1:8000/test,即可查看页面

4.5. 在网页中载入数据

此时网页中的信息是人为写上去的,接下来我们通过连接数据库,从创建的bi_person表中读出数据,并以表格的形式呈现出来。

  • 在views视图中连接数据库,并向HTML模板传递queryset数据

supcon/views.py


from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse,JsonResponse
from supcon.models import BiPerson
def index(request):
    # 取出数据库中的所有数据
    mydata=BiPerson.objects.all()
    # 需要传递给HTML5的对象
    context={'data':mydata}
    return render(request,'first.html',context)


  • 在templates模板中,HTML5接收数据,并循环写出

templates/first.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>示例网站</title>
</head>
<body>
    <p>这是我的第一个网页</p>
    <table>
        <thead>
            <tr>
                <th>person_id</th>
                <th>name</th>
            </tr>
        </thead>
        <tbody>
        {% for item in mydata %}
            <tr>
                <td>{{ item.person_id }}</td>
                <td>{{ item.name }}</td>
            </tr>
         {% endfor %}
        </tbody>
    </table>
</body>
</html>


  • 进入终端/cmd,启动服务
zwl> python manage.py runserver
zwl> # 在运行时可以添加自定义端口,如python manage.py runserver 8008
zwl> # 通过浏览器访问127.0.0.1:8000,可以查看结果
zwl> # 中断操作快捷键:ctrl+c


  • 在浏览器中访问:127.0.0.1:8000/test,即可查看页面

此时,一个基础的网页就已经形成了,剩下的就是如何美化,以及服务部署


5. 美化页面

  • 引入bootstrap插件
  • 引入css样式
  • 引入js文件

6. 实现远程访问

6.1. 设置IP局域网内可访问

进入zwl/settings.py中找到ALLOWED_HOSTS,对原有语句进行注释,并修改为"*"

zwl/settings.py


# ALLOWED_HOSTS = []
ALLOWED_HOSTS ="*"


  • 进入终端/cmd,启动服务时制定IP为0.0.0.0:8000
zwl> python manage.py runserver 0.0.0.0:8000
zwl> # 通过浏览器访问127.0.0.1:8000,可以查看结果
zwl> # 中断操作快捷键:ctrl+c


查看局域网ip地址,通过ipconfig,或者 - 在浏览器中访问:172.21.10.40:8000/test,即可查看页面

6.2. 部署服务器

  • 上传文件夹到服务器,启动服务后进行后台挂起
zwl> python manage.py runserver 0.0.0.0:8000 &
zwl> # 通过浏览器访问127.0.0.1:8000,可以查看结果
zwl> # 中断操作快捷键:ctrl+c


  • 对数据库进行定时抽数,实现数据更新;
  • 配置域名、站点;