概述 - 初识 Django

Django 是一个开放源代码的 Web 应用框架,由 Python 写成。采用了 MTV 的框架模式,即模型 M,视图 V 和模版 T。

有趣的是,这套框架是以比利时的吉普赛爵士吉他手 Django Reinhardt 来命名的。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) 软件,并于 2005 年 7 月在 BSD 许可证下发布。所以使用了 Django 后我们会发现,其“集成管理后台”、“模板页面”等设计思想偏向于帮助人们快速实现一个 CMS(毕竟其前身就是一个CMS,并从中抽象而得之)。

Django 的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以 “插件” 形式服务于整个框架,Django 有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得 Django 具有很强的可扩展性。它还强调快速开发和 DRY (Do Not Repeat Yourself) 原则。Django 框架的核心组件有:

  1. 用于创建模型的对象关系映射;
  2. 为最终用户设计较好的管理界面;
  3. URL 设计;
  4. 设计者友好的模板语言;
  5. 缓存系统

也因为其良好的设计与简单、快速的特点,常用于快速构造中大型内部系统。

1 Django 特点

1.1 优点

  • 提供管理后台,能够快速开发
  • 复用度高,设计、使用上遵循 DRY 原则
  • 易于扩展复用的中间件
  • 内置安全框架
  • 丰富的第三方类库及庞大的用户群、活跃的社区

1.2 缺点

  • 单体应用,不易并行开发、单点扩展
  • 不适合小项目
  • 不适合高并发的 to c 互联网项目

2 环境搭建

2.1 python 环境与 python 发行版本

Python 需要运行时解释,自然运行 python 程序时少不了带上 python 解释器以及 python 程序引用的一些模块包,标准 python 解释器里已经附带了一些通用包,可以直接使用,比如 ossys 之类的。当我们需要使用一些标准 python 中没有的包时,我们就需要安装需要的模块。

由于 python 的这些特点,在我们的实际开发使用过程中,自然就避免不了带来一些麻烦困扰。本机上运行的所有 python 程序依赖模块统一安装在一起,工程多了,依赖模块包多了,变成一个超大依赖仓库,当某个工程需要移到其它机器上运行时,将整个超大依赖仓库一起转移?当我们在开发不同工程时用到不同版本的 python 时,需要不同的 python 环境,修改系统变量切换 python 环境?

这个时候是否发现 python 的世界要一团糟了,当然这些方法都不可取,这个时候就产生了一些Python 的集成发行版本,内置了常用的依赖及环境管理,使开发者不用再担心环境问题一键搭建好所需的开发环境。

2.2 Anaconda

Anaconda 是一个开源的 Python 发行版本,其包含了 conda、Python 等 180 多个科学包及其依赖项,使用这个发行版本能极大的方便我们进行环境的搭建,因为很多东西其已经包含进去了。

  • Conda

其中 Conda 是一个开源的包管理 & 环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换。

  • Condapip

python 基础的同学肯定知道 pip 这个官方的包管理工具,而 Conda 是一个能力在其之上的更强大的包管理工具,她不仅可以安装包和管理包依赖,还可以创建 隔离环境 – 这样可以管理不同版本的 python 包依赖。

2.3 Conda 简易使用

2.3.1 Conda 版本与更新

Conda 版本与更新
1
2
3
4
5
6
7
8
# 查看版本
conda --version

# 更新至最新版本
conda update conda

# 更新 anaconda
conda update anaconda

2.3.2 Conda 包管理

Conda 包管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看一个未安装的包在 Anaconda 库中是否存在
conda search pkg-name

# 安装一个包
conda install pkg-name

# 查看刚安装的包是否存在
conda list

# 查看某个环境下的包
conda list --name ENVNAME

# 将当前环境下包的列表导出指定文件,用于创建新的环境
conda create --name NEWENV --file pkgs.txt

# 更新某个环境下的所有包
conda update --all --name ENVNAME

# 删除某个环境下的包
conda uninstall PKGNAME --name ENVNAME

# 一次安装多个包
conda install --yes PKG1 PKG2

2.3.3 Conda 环境管理

使用 Conda 可以很轻松地管理 python 环境甚至对当前环境进行导出

创建虚拟环境
1
2
3
4
5
6
7
conda create -n your_env_name package_name python=X.X (2.7、3.6 等)
# 创建 `python` 版本为:X.X,不指定时,默认安装最新 Python 版本
# 要安装的包 :package_name 根据需求下载,可不填
# 虚拟环境名字为: your _env_name
# 注意:your_env_name 文件可以在 Anaconda 安装目录 envs 文件下找到

# 举例:conda create -n myenv numpy matplotlib python=3.7

使用 Conda 创建环境后,你可以在这个环境里各种乱玩不用心疼,搞坏了删除重新建立就 OK 了。

  • 删除与激活环境
删除与激活环境
1
2
3
4
5
6
7
8
9
10
11
# 激活环境
conda activate your-env

# 取消激活环境
conda deactivate

# 查看已经创建的环境
conda info --envs

# 完整的删除一个环境
conda remove --name evn_name --all
  • 复制与导入环境

使用环境管理还有个好处,就是当你要迁移工作区时,你不需要重新配置一遍环境,可以将已建好的环境整个 copy 过来:

复制与导入环境
1
2
3
4
5
6
7
8
9
10
11
# 复制 1 个环境
conda create --clone evn_name --name NEWENV

# 将环境导出到 yaml 文件,用于创建新的环境
conda env export --name evn_name > envname.yml
# 根据 yaml 文件创建新环境
conda env create -f=/path/to/environment.yml -n your-env-name

# 将一个环境恢复到指定版本
conda --name evn_name --revisions
conda install --name evn_name --revision

2.4 vsCode 配置 python 开发环境

安装插件:pythondjangodjango template

2.5 安装与运行 Django

2.5.1 安装 django 依赖包

安装 django 依赖包
1
conda install django

2.5.2 创建一个项目

创建一个项目
1
django-admin startproject schoolSystem

2.5.3 运行项目

运行项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
python manage.py migrate

# 创建后台帐户
python manage.py createsuperuser --username admin

# 启动服务器
python manage.py runserver
python manage.py runserver 0.0.0.0:8080
# 是 0.0.0.0 的简写
python manage.py runserver 0:8080

# 默认使用 sqlite

# 首页:localhost:8000/
# 管理后台:localhost:8000/admin

创建并启动项目后,基于地址localhost:8000/就可以访问项目首页,而访问localhost:8000/admin(即在根目录上加admin路径),可访问项目的后台管理页面(所以前面介绍时也说了其基于 CMS 发展的特点,确实对开发类CMS网站非常友好)。

需要注意的是,这样运行起来的是一个开发环境的项目,用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍 Python 代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。

3 运行第一个简单项目

首先我们来看看基于上面步骤创建的基本项目结构

3.1 项目基础结构

项目基础结构
1
2
3
4
5
6
7
8
9
10
11
.
├── firstProj # 主项目配置
│ ├── __init__.py
│ ├── __pycache__
│ ├── asgi.py
│ ├── settings.py # 存放 Django 所有配置
│ ├── urls.py # 存放项目的 url 模式(即我们常说的路由配置)
│ └── wsgi.py # 用于运行开发服务器和把项目部署到生产环境的一个 Python 脚本。

├── db.sqlite3
└── manage.py # Django 管理脚本,它提供了一系列维护 Django 项目的命令

3.2 创建 Django 应用

一个 Django 项目中包含一系列配置和应用,这些在一起共同构成一个完整的 Web 应用或网站。这样做便于运用优秀的软件工程实践。

我们常会将 web 应用分解为多个小应用,在项目目录中使用 startapp 命令创建 Django 应用,比如我们现在创建一个《教务管理系统》,我们先创建最基础的学生管理模块及欢迎页,先创建模块:

startapp 创建模块
1
python manage.py startapp student

模块目录结构如下:

student 模块目录结构
1
2
3
4
5
6
7
8
9
10
11
└── student
├── migrations # 目录:存放与模型有关的数据库信息。
│ └── __init__.py
├── __init__.py
|
├── urls.py # 路由
├── admin.py # 注册模型,让 Django 为你创建管理界面;
├── apps.py # 当前应用的配置;
├── models.py # 存放应用的数据模型,即数据的实体及其之间的关系;
├── tests.py # 存放测试应用代码的函数;
└── views.py # 存放处理请求并返回响应的函数;

3.3 网络请求响应模型

Server端程序基本都逃不开简单的网络请求响应模型,客户端发起请求(Request),服务器接收这个请求对之进行解析并处理。

这个处理就是根据请求的标识,与服务器内部的路由配置,将请求转给对应的控制器(Django 中稳之为 View)处理。

处理完后,响应以响应流的形式返回给客户端。

请求响应模型
1
2
3
4
5
6
7
8
9
10
11
12
                                               ┌─────────────┐
┌────────▶│ ViewA │
│ │ GET('/cats')│
urls.py RouterA └─────────────┘
┌───┐ │
│ S │ │ ┌─────────────┐
┌───────┐ │ e │ │ │ │
│Client │───Request───▶│ r │─────────┴─RouterB──▶│ ViewB │
│ │ │ v │ │POST('/user')│
└───────┘◀──Response───│ e │ └─────────────┘
│ r │
└───┘

3.3.1 配置路由

在项目主目录中,需要配置根路由:

schoolSystem/urls.py
1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
path('student/', include('student.urls')),
path('admin/', admin.site.urls),
]

这里会将路径中以 student 开头的请求转发给 student 模块的 urls 路由配制文件(使用 include() 函数,可将请求转发给子路由);

然后配置student 模块中的路由文件:

schoolSystem/student/urls.py
1
2
3
4
5
6
from django.urls import path
from student import views

urlpatterns = [
path('', views.index, name="index"),
]

这里最终将请求路由给 views.py 这个视图文件处理:

3.3.2 视图处理函数

在上面的 url模式文件,将请求转给 views.py 这个视图文件处理,具体是转给了视图文件的 views.index() 函数:

schoolSystem/student/views.py
1
2
3
4
from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, student!")

这个函数很简单,框架将请求封装好成为一个请求对象,再返回一个响应对象。就如同我们上面的数据流图一样,将整个流程抽象成输入请求、输出响应。

3.3.3 运行项目

最后,我们敲入命令运行项目:

1
python manage.py runserver 0.0.0.0:8080

访问 localhost:8080/student 即可看到 "Hello, student!" 文本,说明我们的 demo 运行成功了。

访问 localhost:8080/admin 即可看到进入后台,输入我们之前创建的管理账号及密码即可进入后台管理系统了。