目录
一、MVC与MTV模型
MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(Model),控制器(Controler)和视图(View)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入然后调用模型和视图完成用户的请求,其示意图如下所示:
MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是指:
-
M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
-
T 代表模板 (Template):负责如何把页面展示给用户(html)。
-
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
二、Django中的ORM
首先我们来介绍一下什么是ORM?
我们可能经常听到orm这几个连起来的字母, 也有很多人会使用orm, 但是很多人都只是知其然而不知其所以然, 那我们经常说的orm到底是个什么东西呢, 笔者不才, 在这里根据自己的理解写一个关于orm的工作原理, 有错误的地方,还望各位大神指出.
首先ORM的全称是Object Relation Map, 解释一下就是对象关系映射, 那么问题来了, 什么是对象关系映射呢?
关于对象关系映射:
我们在写程序的时候难免会和数据库打交道, 我们知道数据在数据库中是以表的方式存在的,每个表中有很多字段来记录一条数据的不同状态从而来完整一条数据完整的记录, 那么我们在写代码的时候应该怎么和数据库进行数据交互呢, 有一种原始的方式就是, 根据不同的语言使用不同方式去链接数据库,比如在python中使用pymysql进行数据库的连接, 然后使用原生的sql语句去操作数据库, 完成对数据的增删改查, 但是这样做在实际生产环境中难免会大大拖慢我们的生产速度, 我们知道在计算机语言中,比如在python中, 对对象进行操作会方便很多, 直接使用点语法对对象进行操作, 可以很方便的对对象中的数据进行增删改查, 那么如果我们可以把python中的对象和数据库之间找到一中关系对应起来, 那么对数据库的操作就会方便许多, orm正是基于这种思想被创造出来的, 它将数据库中的表和python中的类对应起来, 将数据库中的表中的一条条数据和类的属性一一对应起来, 然后在类中定义方法和对数据库的增删改查对应起来, 我们将这种和数据库中的表一一对应的类称之为表模型, 在程序中我们去到表模型之后就可以对数据库进行增删改查了, 要注意的是这些表模型要继承元类, 使用单例模式来控制创建类的时候自动生成建表sql等逻辑处理来完成orm的构造.
2.1、ORM简介
查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装
-
MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
-
ORM是“对象-关系-映射”的简称, 下图是使用orm将数据库和python中的类关联起来的示意图
三、Django的生命请求周期
我们在使用Django的过程中, 要明确Django完整的生命请求周期, 为什么说生命请求周期呢? 这里我们说的声明请求周期指的是一个完整的Django请求, 根据上面的示意图, 我们来详细的讲述一下Django的生命请求周期:
前提是: 我们的django环境和路由配置和视图响应函数都配置完成的情况下:
首先由浏览器发出http请求--(包括请求行, 请求头和请求体), 基于socket建立好的双向连接想web服务器发送http请求, 请求到了服务器以后, 根据wsgi协议对http请求进行拆分, 根据拆分好的内容到中间件中进行过滤, 中间件进行过滤是为了保证该请求是个正常的可以处理的请求, 保证服务器不会被恶意攻击等, 然后到路由层根据PATH_INFO中的路由匹配到不同的视图响应函数, 在视图响应函数中对请求内容进行逻辑处理, 是要到数据库中对比数据还是到数据库中取数据等和数据库之间的交互, 或者是要渲染相应的模板然后返回给前台, 在这一系列业务逻辑处理完毕后,会返回一个HttpResponse对象给前端浏览器, 浏览器接收到这个响应之后对响应进行解析, 做出相应的动作, 这样一个完整的Django的声明请求周期才算完整结束, 在这个过程中任何一个环节出问题都会导致请求或者响应不能顺利完成.