1、MVC简介
最初是由施乐公司旗下的帕罗奥多研究中心的一位研究人员给 smalltalk语言发明的一中软件设计模式。
MVC的理念:分工。
MVC的核心思想:解耦。
1.1 Web MVC模型
![](https://img-blog.csdnimg.cn/img_convert/df8f4e536a7dba0794b57bebb3269439.png)
M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查等操作。
V全拼为View,用于封装结果,生成页面展示的html内容。
C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
2、Django简介
Django的主要目的是简便、快速的开发数据库驱动的网站,它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。
Django官网:https://www.djangoproject.com/
Django源码:https://github.com/django/django
Django官方文档:https://docs.djangoproject.com/zh-hans/3.0/
Django框架遵循MVC设计,但有一个专有名词:MVT
2.1 Django的MVT模型
![](https://img-blog.csdnimg.cn/img_convert/8a8308bc7da951e947de74ccc288cdef.png)
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
MVC和MVT之间的差异就在于黑线黑箭头标识出来的Template部分。
3、环境搭建
3.1 配置虚拟环境
(1)安装虚拟环境:sudo apt install virtualenv
(2)安装虚拟环境扩展包:sudo apt install virtualenvwrapper,安装虚拟环境包装器的目的是使用更加简单的命令来管理虚拟环境。
(3)修改用户家目录下的配置文件.bashrc,添加:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
(4)使用source .bashrc命令使配置文件失效。
3.2 创建虚拟环境
(1)mkvirtualenv -p python3 虚拟环境名称
![](https://img-blog.csdnimg.cn/img_convert/1cc68b02f563232a99ae85d0083ec836.png)
(2)说明
1)创建成功后,会自动工作在这个虚拟环境上
2)工作在虚拟环境上,提示符最前面会出现"虚拟环境名称"
3)所以的虚拟环境,都位于/home/username/下的隐藏目录.virtualenvs下。
![](https://img-blog.csdnimg.cn/img_convert/11f55ca51bb4b3961be3cae6c8929756.png)
3.3 退出虚拟环境
deactivate #退出虚拟环境
3.4 查看与使用
查看所有虚拟环境的命令:workon 两次tab键
使用虚拟环境的命令:workon 虚拟环境名称
3.5 删除虚拟环境
(1)确保退出虚拟环境:deactivate
(2)删除:rmvitualenv 虚拟环境名
3.5 包操作
(1)通过pip命令安装包:pip install 包名称
sudo pip install 包名称这个命令会将包安装到真实主机上。
(2)查看已安装的python包命令:
pip list
pip freeze
4、创建项目
Django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块。
4.1 创建Django运行的虚拟环境
创建:mkvirtualenv py3_Django_env
安装Django:pip install django==1.8.2
运行:workon py3_Django_env
4.2 在用户目录下建立文件夹存放文件
cd ~/Desktop/demo/Django
4.3 创建项目
django-admin startproject 项目名称
![](https://img-blog.csdnimg.cn/img_convert/900bc30eece5d310b1e485471b72442a.png)
(1)manage.py是项目管理文件,通过它管理项目
(2)在项目文件夹中,py3_django_test为与项目同名文件,放置配置信息
(3)__init__.py是一个空文件,表示这个目录可以被当成包使用
(4)settings.py是项目的整体配置文件
(5)urls.py是项目的url配置文件
(6)wsgi.py是项目与WSGI兼容的Web服务器入口
4.4 创建应用
使用一个应用开发一个业务模块
# 创建应用名称为booktest,完成图书-英雄的信息维护
python manage.py startapp booktest
![](https://img-blog.csdnimg.cn/img_convert/5e3d4ac2cef78b487d590e084003bb41.png)
(1)__init__.py是一个空文件,表示当前目录booktest可以当作一个python包使用。
(2)tests.py文件用于开发测试用例,在实际开发中会有专门的测试人员来使用。
(3)models.py文件跟数据库操作相关
(4)views.py文件跟接收浏览器请求,进行处理,返回页面相关
(5)admin.py文件跟网站的后台管理相关
(6)migrations文件夹存放模型操纵数据库后的迁移文件
4.5 安装应用
应用创建成功后,需要安装才可以使用,也就是建立应用和项目之间的关联。
在settings.py中INSTALLED_APPS下添加应用的名称就可以完成安装。
![](https://img-blog.csdnimg.cn/img_convert/20822ed7277fb5987188d87cc89fdc82.png)
4.6 开发服务器
在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。
运行服务器命令:python manage.py runserver ip:port
说明:(1)可以不写ip和端口,默认ip是127.0.0.1,默认端口为8000。
(2)通过浏览器访问
![](https://img-blog.csdnimg.cn/img_convert/105add231df9c6ab17125365b207b49e.png)
(3)如果增加、修改、删除文件,服务器会自动重启,按ctrl+c停止服务器。
5、模型设计(models.py)
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤如下:
(1)在models.py中定义模型类
(2)迁移
(3)通过类和对象完成数据增删改查操作
5.1 ORM框架
O是object,即类对象;R是relation,关系数据库中数据表;M是mapping,映射。
在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。
ORM框架可以根据我们设计的类自动帮我们生成数据库中的表格,略去自己建表的过程。
5.2 定义模型类
模型类定义在models.py文件中,继承自models.Model类。
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长。
5.2.1 设计图书类
(1)类名:BookInfo
(2)图书名称:btitle
(3)图书发布日期:bpub_date
5.2.2 模型类的设计
![](https://img-blog.csdnimg.cn/img_convert/ec8fa00369ac9f998ccff397c66a29b3.png)
5.2.3 迁移
迁移由两步完成:
(1)生成迁移文件:根据模型类生成创建表的迁移文件
(2)执行迁移:根据生成的迁移文件在数据库中创建表
生成迁移文件命令:python manage.py makemigrations
![](https://img-blog.csdnimg.cn/img_convert/57df122dee12f488c0667b13e77640c4.png)
执行生成迁移文件命令后,会在应用booktest目录下的migrations目录中生成迁移文件。
![](https://img-blog.csdnimg.cn/img_convert/acd59a06881b02d0a2eeb1e3f388d440.png)
Django框架根据设计的模型类生成了迁移文件,在迁移文件中可以看到fields列表中每一个元素跟BookInfo类属性名以及属性的类型是一致的。其中id项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长。
执行迁移命令:python manage.py migrate
![](https://img-blog.csdnimg.cn/img_convert/1324703ffeba571b6dfe9bc2d71b46eb.png)
当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。
![](https://img-blog.csdnimg.cn/img_convert/c7190cabc5fdb7565025b36f065bf0fe.png)
Django默认采用sqlite3数据库,上图中的db.sqlit3就是Django框架帮我们自动生成的数据库文件。
安装sqlitebrowser查看db.sqlite3文件:sudo apt-get install sqliteborwser
在终端中启动:spliteborwser
spliteborwser界面如下:
![](https://img-blog.csdnimg.cn/img_convert/f983c3a289f744f6968df972a36ba0fe.png)
打开db.sqlite3文件
![](https://img-blog.csdnimg.cn/img_convert/2d6f8b0f05b3894c3d7b293b94f43fc1.png)
![](https://img-blog.csdnimg.cn/img_convert/324d5a821ad5b694ac387596f1677e89.png)
上面生成的表的名字叫做booktest_bookinfo,其中booktest是应用的名字,bookinfo是模型类的名字。
数据表的默认名称为:<app_name>_<model_name>
5.3 设计英雄类
5.3.1 英雄类
(1)类名:HeroInfo
(2)英雄姓名:hname
(3)英雄性别:hgender
(4)英雄简介:hcomment
(5)英雄所属图书:hbook
(6)图书-英雄的关系为一对多
![](https://img-blog.csdnimg.cn/img_convert/019d2e65178e216d0ac3cb0388005d2a.png)
生成迁移文件并执行:
![](https://img-blog.csdnimg.cn/img_convert/351bc8d06af9e30d3d1d9b0943310cc5.png)
BookInfo和HeroInfo类之间具有一对多的关系,一对多的关系应该定义在多的哪个类HeroInfo类中。
hbook=models.ForeignKey('BookInfo')这句代码让BookInfo类和HeroInfo类之间建立了一对多的关系。
其中booktest_heroInfo表中的hbook_id字段是根据HeroInfo类的关系属性hbook生成的,对应着图书表中的主键id。
5.4 数据操作
完成数据表的迁移之后,可以通过进入项目的shell,进行简单的API操作。
进入项目shell的命令:python manage.py shell
退出:ctrl+d或输入quit()
![](https://img-blog.csdnimg.cn/img_convert/ada2c2f0c7a12ef34455625a4eda2440.png)
对象的关联操作
![](https://img-blog.csdnimg.cn/img_convert/940cd1e2496408941d6411bdcbb058d4.png)
![](https://img-blog.csdnimg.cn/img_convert/d800435282950d79f55ef5bba0e28f01.png)
6、后台管理
Django能够根据定义的模型类自动地生成管理页面
使用Django的管理模块,需要按照如下步骤操作:
(1)管理界面本地化
(2)创建管理员
(3)注册模型类
(4)自定义管理页面
6.1 管理界面本地化
本地化是将显示的语言、时间等使用本地的。即中国大陆地区使用简体中文,时区使用亚洲/上海。
打开settings.py文件,找到语言编码、时区的设置项,更改内容:
![](https://img-blog.csdnimg.cn/img_convert/e7134bfc16aad3ae59b8c0056e731af4.png)
6.2 创建管理员
创建管理员的命令:python manage.py createsuperuser
按提示输入用户名、邮箱、密码
接下来启动服务器:python manage.py runserver
![](https://img-blog.csdnimg.cn/img_convert/93267a37e7ffc7be81e9e7e59f01f24f.png)
打开浏览器,在地址栏中输入如下地址后回车
![](https://img-blog.csdnimg.cn/img_convert/a01dbe5d806b877be62574ffad802da3.png)
输入前面创建的用户名、密码完成登录
6.3 注册模型类
登录后台管理后,默认没有我们创建的应用中定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并进行增删改查操作。
![](https://img-blog.csdnimg.cn/img_convert/07b7d479ca3e3884060bc26f52cf756d.png)
![](https://img-blog.csdnimg.cn/img_convert/8e0a35bc2450f296ae218e0ea281848f.png)
6.4 自定义管理页面
Django提供了自定义管理页面的功能,比如列表页要显示哪些值。
在admin.py中,自定义类,继承自admin.ModelAdmin类:
![](https://img-blog.csdnimg.cn/img_convert/75a2acd19ecdb3929df2925b3feefefe.png)
![](https://img-blog.csdnimg.cn/img_convert/3e051a0a07c2254ae4375244d618d938.png)
7、视图
对于django的设计框架MVT,用户在URL中请求的是视图,视图接收请求后进行处理,并将处理的结果返回给请求者。
使用视图时需要进行两步操作:
(1)定义视图函数
(2)配置URLconf
7.1 定义视图
视图是一个python函数,被定义在views.py中。
视图必须有一个参数request,必须返回HttpResponse对象,HttpResponse中的参数内容会显示在浏览器的页面上。
![](https://img-blog.csdnimg.cn/img_convert/4273f729a18e198131122bd2206b907d.png)
7.2 配置URLconf
请求者在浏览器地址栏中输入url,请求到网站后,获取url信息,然后与编写好的URLconf逐条匹配,如果匹配成功则调用对应的视图函数,如果所有的URLconf都没有匹配成功,则返回404错误。
一条URLconf包括url规则、视图两部分:
(1)url规则使用正则表达式定义。
(2)视图就是在views.py中定义的视图函数。
需要两步完成URLconf配置:
(1)在应用中定义URLconf
(2)包含到项目的URLconf中
7.2.1 在应用下创建urls.py文件,并将视图链接到url请求:
![](https://img-blog.csdnimg.cn/img_convert/9e11bc69fe8c31cefdf5336c36880666.png)
7.2.2 将应用中的urls.py包含到总设置中的urls.py中,让其匹配后可以跳转:
![](https://img-blog.csdnimg.cn/img_convert/042b1b4f360889bb1c2c66196b7c6be5.png)
7.3 请求访问
视图和URLconf都定义好了,接下来在浏览器中输入对应的url请求:
http://127.0.0.1:8000/index/
![](https://img-blog.csdnimg.cn/img_convert/6548eed198f801d39df8b04fa6a27346.png)
8、 模板
在Django中,将前端的内容定义在模板中,然后再把模板交给视图调用。
8.1 创建模板
在项目中建立和应用booktest同级的目录templates,并创建下级目录booktest存放app中使用的静态文件
![](https://img-blog.csdnimg.cn/img_convert/a0efa5ca7a96814f9854a5dab519b9c4.png)
8.2 设置查找模板的路径
在settings.py文件中,设置TEMPLATES的DIRS值
![](https://img-blog.csdnimg.cn/img_convert/ce35392e93cbee4abd77ae32cca97b29.png)
8.3 定义模板
![](https://img-blog.csdnimg.cn/img_convert/3308a0b8d972286085a22a47c878f91c.png)
在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的:{ { 变量名 } }
在模板中编写代码段语法如下:{ % 代码段 % }
8.4 视图调用模板
调用模板分为三个步骤:
(1)找到模板
(2)定义上下文
(3)渲染模板
![](https://img-blog.csdnimg.cn/img_convert/31eadf8dc4b72863b313f123db2d6b40.png)
浏览器效果:
![](https://img-blog.csdnimg.cn/img_convert/2cf545fc33fd0d2955be069d896737f5.png)
8.5 视图调用模板简写
视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码。
方法render包含3个参数:
(1)第一个参数为request对象
(2)第二个参数为模板文件路径
(3)第三个参数为字典,表示向模板中传递的上下文数据
![](https://img-blog.csdnimg.cn/img_convert/17519abf5e9dc1f16db7f3289ef8ff52.png)
![](https://img-blog.csdnimg.cn/img_convert/6532436d379afc0ee871907091a92150.png)
9、实践项目
9.1 定义视图
![](https://img-blog.csdnimg.cn/img_convert/a3dd3d24ca78f2b6a224f2184c81445f.png)
9.2 配置url
![](https://img-blog.csdnimg.cn/img_convert/c9efb9f2e1a3aa6caf478bbfb607618a.png)
9.3 定义模板
![](https://img-blog.csdnimg.cn/img_convert/ac155520966eeaf4026a1bcba54a6a46.png)
![](https://img-blog.csdnimg.cn/img_convert/44ba652cadddb143b905dd22c66cb66c.png)