Django简介
-
Django
: 发音为 [ `dʒæŋɡəʊ ]. 名称来源于比利时爵士音乐家 Django Reinhardt -
Python
语言写的开源web开发框架, 发布于2005年7月. -
Django
的主要目的是简便、快速的开发数据库驱动的网站. -
Django
强调代码复用, 多个组件可以很方便的以“插件”
形式服务于整个框架. 有许多功能强大的第三方插件. -
Django
遵循MVC
设计模式. 但是有一个专有名词 :MVT
- Django官方网站
- Django源码-GitHub
- Django中文文档
MVC介绍
-
MVC
全拼为Model-View-Controller
-
MVC
核心思想 : 解耦- 让不同的模块之间降低耦合, 增强代码的可扩展性和可移植性, 实现更好的向后续版本的兼容
- 开发原则 : 高内聚, 低耦合
-
MVC
解析-
M
全拼为Model
, 主要封装对数据库层的访问, 内嵌ORM框架, 实现面向对象的编程来操作数据库. -
V
全拼为View
, 用于封装结果, 内嵌了模板引擎, 实现动态展示数据. -
C
全拼为Controller
, 用于接收GET或POST请求, 处理业务逻辑, 与Model和View交互, 返回结果.
-
- 当前主流的开发语言如
Java、PHP、Python、...
中都有MVC
设计模式.
MVT介绍
-
MVT
全拼为Model-View-Template
-
MVT
核心思想 : 解耦 -
MVT
解析-
M (模型)
全拼为Model
, 与MVC中的M功能相同, 负责数据处理, 内嵌了ORM框架. -
V (视图)
全拼为View
, 与MVC中的C功能相同, 接收HttpRequest, 业务处理,返回HttpResponse. -
T (模板)
全拼为Template
, 与MVC中的V功能相同, 负责封装构造要返回的html, 内嵌了模板引擎.
-
-
MVT和MVC
差异就在于黑箭头标识出来的部分.
总结
学习 Django, 重点就是研究
Model-View-Template
三个模块间如何协同工作及各自模块的代码如何编写。
补充
设计模式
- 设计模式:是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
- 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
- 设计模式使代码编写真正工程化。
- 设计模式是软件工程的基石脉络,如同大厦的结构一样。
高内聚,低耦合
-
耦合性:指软件系统结构中各模块间相互联系紧密程度的一种度量。
- 模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。
- 模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
-
内聚性:指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。
- 若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
虚拟环境
为什么要搭建虚拟环境?
-
在开发过程中, 当需要使用
python
的某些工具包/框架时需要联网安装- 比如联网安装Django框架
django1.8.2
版本
- 比如联网安装Django框架
提示:使用如上命令, 会将
django1.8.2
安装到/usr/local/lib/python版本/dist-packages
路径下问题 : 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它的项目就无法运行了.
-
解决方案 :
虚拟环境
-
作用 :
虚拟环境
可以搭建独立的python运行环境
, 使得单个项目的运行环境与其它项目互不影响. - 所有的
虚拟环境
都位于/home/
下的隐藏目录.virtualenvs
下
-
作用 :
如何搭建虚拟环境?
-
安装虚拟环境的命令 :
sudo pip install virtualenv sudo pip install virtualenvwrapper
-
创建虚拟环境的命令 :
- 提示:如果不指定python版本,默认安装的是python2的虚拟环境
- 在python2中,创建虚拟环境
mkvirtualenv 虚拟环境名称 例 : mkvirtualenv py_django
- 在python3中,创建虚拟环境
mkvirtualenv -p python3 虚拟环境名称 例 : mkvirtualenv -p python3 py3_django
-
提示 :
- 创建虚拟环境需要联网
- 创建成功后, 会自动工作在这个虚拟环境上
- 工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称”
如何使用虚拟环境?
-
查看虚拟环境的命令 :
workon 两次tab键
- 使用虚拟环境的命令 :
workon 虚拟环境名称 例 :使用python2的虚拟环境 workon py_django 例 :使用python3的虚拟环境 workon py3_django
- 退出虚拟环境的命令 :
deactivate
- 删除虚拟环境的命令 :
rmvirtualenv 虚拟环境名称 例 :删除虚拟环境py3_django 先退出:deactivate 再删除:rmvirtualenv py3_django
如何在虚拟环境中安装工具包?
- python3版本下安装django1.8.2的包 :
pip install 包名称 例 : 安装django1.8.2的包 pip install django==1.8.2
-
工具包安装的位置 :
- python2版本下:
~/.virtualenvs/py_django/lib/python2.7/site-packages/
- python3版本下:
~/.virtualenvs/py3_django/lib/python3.5/site-packages
- python2版本下:
-
查看虚拟环境中安装的包 :
pip freeze
创建Django项目
- 在Django项目中,项目的组织结构为:一个项目包含多个应用,一个应用对应一个业务模块。
-
示例:创建项目的名称为
BookManager
,创建应用名称为Book
,完成图书信息
的维护。 - 提示:在当前用户的某个目录下创建项目,这样不会发生权限问题。
创建项目
-
在
~/Desktop/.../
目录下创建项目BookManager
例 : 在桌面创建项目 cd ~/Desktop/
-
创建项目的命令:
- 创建好项目就可以使用
PyCharm
打开。django-admin startproject 项目名称 例 :创建项目BookManager django-admin startproject BookManager
- 创建好项目就可以使用
-
项目结构
-
BookManager
:是与项目同名的文件,内部包含如下项目的配置文件。-
init.py
:是表示文件BookManager
可以被视为包使用。 -
settings.py
:是项目的整体配置文件。 -
urls.py
:是项目的URL
配置文件。 -
wsgi.py
:是项目与WSGI
兼容的Web服务器入口。
-
-
manage.py
:是项目运行的入口,指定配置文件路径。
-
创建应用
-
在
BookManager
项目中,创建应用Book
cd BookManager/ python manage.py startapp Book
-
项目结构
-
admin.py
:是后台的站点管理注册文件。 -
init.py
:是表示文件Book
可以被视为包使用。 -
migrations
:是做模型迁移的。 -
models.py
:是处理数据的。MVT
中的M
-
tests.py
:是做测试用的。 -
views.py
:是处理业务逻辑的。MVT
中的V
-
选择并添加对应虚拟环境下的python
- 虚拟环境
py_django
下的pythonwhich python 结果: /home/python/.virtualenvs/py_django/bin/python
- 虚拟环境
py3_django
下的pythonwhich python 结果: /home/python/.virtualenvs/py3_django/bin/python
![选取并添加python3](https://upload-images.jianshu.io/upload_images/2760539-ca06df99e8eaaf42.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
安装应用
-
安装应用前
-
安装应用后
测试服务器
-
在开发阶段,为了能够快速预览到开发的效果,
Django
提供一个纯Python
编写的轻量级web服务器
,- 仅在开发阶段使用,非正式服务器
-
运行测试服务器的命令:
python manage.py runserver ip:端口
python manage.py runserver 172.16.21.25:8001 对应: http://172.16.21.25:8001/
-
ip和端口号可以不写,默认ip为
127.0.0.1
;端口号为8000
。python manage.py runserver 对应: http://127.0.0.1:8000/
提示:如果项目的虚拟环境由
py3_django
切换到py_django
时,需要同时切换测试服务器的虚拟环境到py_django
-
输入
http://127.0.0.1:8000/
即可访问。- 刷新网页就可以查看每次代码执行效果
- 如果
增加代码、修改代码、删除代码
服务器会自动重启。 - 按
ctrl+c
停止服务器
模型
- 当前项目的开发, 都是数据驱动的。
- 以下为书籍信息管理的数据关系:书籍和人物是 :一对多关系
- 要先分析出项目中所需要的数据, 然后设计数据库表.
书籍信息表
字段名 | 字段类型 | 字段说明 |
---|---|---|
id | AutoField | 主键 |
name | CharField | 书名 |
id | name |
---|---|
1 | 西游记 |
2 | 三国演义 |
人物信息表
字段名 | 字段类型 | 字段说明 |
---|---|---|
id | AutoField | 主键 |
name | CharField | 人名 |
gender | BooleanField | 性别 |
book | ForeignKey | 外键 |
id | name | gender | book |
---|---|---|---|
1 | 孙悟空 | False | 1 |
2 | 白骨精 | True | 1 |
3 | 曹操 | False | 2 |
4 | 貂蝉 | True | 2 |
使用Django进行数据库开发的提示 :
-
MVT
设计模式中的Model
, 专门负责和数据库交互.对应(models.py)
- 由于
Model
中内嵌了ORM框架
, 所以不需要直接面向数据库编程. - 而是定义模型类, 通过
模型类和对象
完成数据库表的增删改查
. -
ORM框架
就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.
使用Django进行数据库开发的步骤 :
- 定义模型类
- 模型迁移
- 操作数据库
1. 定义模型类
-
根据书籍表结构设计模型类:
- 模型类:BookInfo
- 书籍名称字段:name
-
根据人物表结构设计模型类:
- 模型类:PeopleInfo
- 人物姓名字段:name
- 人物性别字段:gender
- 外键约束:book
- 外键要指定所属的模型类
book = models.ForeignKey(BookInfo)
- 外键要指定所属的模型类
-
说明 :
- 书籍-人物的关系为一对多. 一本书中可以有多个英雄.
- 不需要定义主键字段, 在生成表时会自动添加, 并且值为自增长.
-
根据数据库表的设计
- 在
models.py
中定义模型类,继承自models.Model
from django.db import models # 准备书籍列表信息的模型类 class BookInfo(models.Model): # 创建字段,字段类型... name = models.CharField(max_length=10) # 准备人物列表信息的模型类 class PeopleInfo(models.Model): name = models.CharField(max_length=10) gender = models.BooleanField() # 外键约束:人物属于哪本书 book = models.ForeignKey(BookInfo) # 模型类准备好之后,需要创建和执行迁移==建表
- 在
2. 模型迁移 (建表)
-
迁移由两步完成 :
- 生成迁移文件:根据模型类生成创建表的语句
python manage.py makemigrations
- 执行迁移:根据第一步生成的语句在数据库中创建表
python manage.py migrate
- 生成迁移文件:根据模型类生成创建表的语句
-
迁移前
-
迁移后
提示:默认采用
sqlite3
数据库来存储数据
3. 操作数据库
- 通过
模型类和对象
完成数据库表的增删改查
. - 进入项目的
shell
, 进行简单的增删改查
API
操作.- 按
ctrl+d
或输入quit()
可以退出shell
.python manage.py shell
- 按
- 测试
增删改查
API
操作# 引入应用中的模型类 from Book.models import * # 创建书籍模型对象 book = BookInfo() # 新增记录 book.name = 'xiyouji' # 保存记录 book.save() # 查询记录 BookInfo.objects.all() # 删除记录 : 再查询时,表里数据为空 book.delete() # 创建人物模型对象 people = PeopleInfo() people.name = 'sunwukong' people.gender = True people.book = book people.save() # 外键查询 : 查询书里面保存的人物信息(peopleinfo_set是隐式生成的) book.peopleinfo_set.all() # 退出shell quit()
4 站点管理
-
站点 : 分为
内容发布
和公共访问
两部分 - 内容发布 的部分由网站的管理员负责查看、添加、修改、删除数据
-
Django
能够根据定义的模型类自动地生成管理模块 - 使用
Django
的管理模块, 需要按照如下步骤操作 :- 1.管理界面本地化
- 2.创建管理员
- 3.注册模型类
- 4.发布内容到数据库
- 5.自定义站点管理页面
1.管理界面本地化
- 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化.
- 中国大陆地区使用
简体中文
, 时区使用亚洲/上海时区
, 注意这里不使用北京时区. - 本地化前
[图片上传中...(image.png-4058e4-1594127813226-0)]
- 本地化后
2.创建管理员
-
创建管理员的命令 :
python manage.py createsuperuser
-
按提示输入用户名、邮箱、密码
-
登陆站点 :
http://127.0.0.1:8000/admin
- 需要服务器是启动状态
-
登陆站点成功
- 站点界面中没有书籍和人物管理入口,因为没有注册模型类
3.注册模型类
-
在
应用
的admin.py
文件中注册模型类- 需要导入模型模块 :
from models import *
- 需要导入模型模块 :
-
注册模型后
注册模型成功后, 就可以在站点管理界面方便快速的管理数据.
4.发布内容到数据库
-
发布内容后,优化模型类展示
class BookInfo(models.Model): """定义书籍信息模型类""" name = models.CharField(max_length=10) def __str__(self): """将模型类以字符串的方式输出""" return self.name
5.自定义站点管理页面
- 自定义站点管理界面前
如果想在站点界面中展示详细的字段信息,需要自定义管理页面
-
即 在
应用
的admin.py
文件中需要重新注册模型类新建类继承自
admin.ModelAdmin
重写
list_display
,指定需要展示的字段-
将
PeopleAdmin
注册到站点# 自定义站点管理界面的类 : 重写list_display属性 class PeopleAdmin(admin.ModelAdmin): list_display = ['id','name','gender','book'] # 注册人物模型 admin.site.register(PeopleInfo,PeopleAdmin)
-
自定义站点管理界面后
视图和URL
- 站点管理页面做好了, 接下来就要做
公共访问
的页面了. - 对于
Django
的设计框架MVT
.- 用户在URL中请求的是视图.
- 视图接收请求后进行处理.
- 并将处理的结果返回给请求者.
- 使用视图时需要进行两步操作
- 1.定义视图
- 2.配置URLconf
1. 定义视图
视图就是一个
Python
函数,被定义在应用
的views.py
中.视图的第一个参数是
HttpRequest
类型的对象reqeust
,包含了所有请求信息
.视图必须返回
HttpResponse对象
,包含返回给请求者的响应信息
.需要导入
HttpResponse
模块 :from django.http import HttpResponse
定义视图函数 : 响应字符串
OK!
给客户端
思考 : 如何才能让请求找到视图?
2. 配置URLconf
-
查找视图的过程 :
- 1.请求者在浏览器地址栏中输入URL, 请求到网站.
- 2.网站获取URL信息.
- 3.然后与编写好的URLconf逐条匹配.
- 4.如果匹配成功则调用对应的视图.
- 5.如果所有的URLconf都没有匹配成功.则返回404错误.
-
URLconf
入口
-
需要两步完成
URLconf
配置- 1.在
项目
中定义URLconf
- 2.在
应用
中定义URLconf
- 1.在
在
项目
中定义URLconf
-
在
应用
中定义URLconf
-
提示:一条
URLconf
包括URL规则、视图两部分- URL规则使用正则表达式定义.
- 视图就是在
views.py
中定义的视图函数.
-
3. 测试:请求访问
http://127.0.0.1:8000/
总结View和URL匹配流程
模板
思考 : 网站如何向客户端返回一个漂亮的页面呢?
-
提示 :
- 漂亮的页面需要
html
、css
、js
. - 可以把这一堆字段串全都写到视图中, 作为
HttpResponse()
的参数,响应给客户端.
- 漂亮的页面需要
-
问题 :
- 视图部分代码臃肿, 耦合度高.
- 这样定义的字符串是不会出任何效果和错误的.
- 效果无法及时查看.有错也不容易及时发现.
-
设想 :
- 是否可以有一个专门定义前端页面的地方, 效果可以及时展示,错误可以及时发现,并且可以降低模块间耦合度!
-
解决问题 : 模板
-
MVT
设计模式中的T
,Template
-
在
Django
中, 将前端的内容定义在模板中, 然后再把模板交给视图调用, 各种漂亮、炫酷的效果就出现了.
模板使用步骤
- 1.创建模板
- 2.设置模板查找路径
- 3.模板接收视图传入的数据
- 4.模板处理数据
1.创建模板
- 在
应用
同级目录下创建模板文件夹templates
. 文件夹名称固定写法. - 在
templates
文件夹下, 创建应用
同名文件夹. 例,Book
- 在
应用
同名文件夹下创建网页模板
文件. 例 :index.html
2.设置模板查找路径
3.模板接收视图传入的数据
- 模板查找全路径 :
os.path.join(BASE_DIR,'templates'+'Book/index.html'
4.模板处理数据
5. 查看模板处理数据成果
总结View-Templates流程