概述

django 框架是在 2005 年开源,是迄今为止 python web 开发界名气最大的框架, 以 github 星星数量来比, 它遵循 Model-View-Template 开发模式,那么在使用之前就必须了解 django 的 MVT 架构设计。

django 开发模式:MVT 模式

说道 MVT 模式就不得不提 MVC, MVC 是由视图View、控制器Controller、模型Model组成,在我们实际使用中模型主要负责应用程序核心逻辑, 视图用来处理和客户端的交互操作, 控制器定义程序行为的操作, 大部分开发语言中都有 MVC 框架, 它的核心是解耦, 降低各功能模块之间的耦合性, 方便修改, 容易重构代码, 最大程度上实现代码的重用。
MVT 基于 MVC, 并在 MVC 的基础上做了更细的划分, 区别主要在于 C 和 T,C之前是控制器, 现在变成了 Template 把 C 融入到了 View 里, 视图负责业务逻辑并在需要的时候调用 model 和 template 把页面展示给使用者。

django 主要组成部分

管理工具(Management):后台站点管理
模型(Model):提供模型的定义以及数据库操作工具(orm)
视图(View):实现向使用者返回 web 页面资料等功能
模板(Template):django 有一套自己页面渲染语言, 自定义页面的生成方式, 但在目前前后端分离的模式中已经逐渐淘汰
表单(Form): 可以进行数据的校验,也可以根据数据库中的属性生成 html 表单

Views 层

用户通过浏览器向服务器发送请求, 服务器匹配到对应的 url 进行分发,django 判断此请求是否有相应的响应,这就到了 view 层, 也是 MVT 开始起作用的地方, 视图是请求的响应, 可以是一系列的数据, 也可以是一个 html 页面,view 层是模板与模型的连接点,用来展示用户可以看到的数据, 也可以接受用户提交的数据, 比如保存数据到数据库中, 通常与 url 一起工作, 根据 urls.py 中的关系条目, 去找到请求对应的视图函数, 那么单单知道以上流程就行了吗?上述我们提到 MVT 和 MVC 都是为了解耦才提出来的这种架构,目的就是为了每层做每层应该做的事情, 这样才能最大化的发挥每层的优势,view 层里面要应该做哪些? 尽量不去做哪些任务呢?
应该做的事情:
做一些增删改查的操作, 和数据库相关的尽量放到 model 层去操作, 避免做过多的逻辑, 他的任务就是接收数据,响应数据
不应该做的事情:
避免大量的 sql 操作,复杂的数据逻辑处理, 应抽象到每个 model 里

Model 层

Model 层是一个重要的部分, 它涉及到对数据库的操作,如果一个请求需要花费好几秒那大部分原因就是数据库没设计好或者是查询时效率不高,django 提供了一个重要的工具就是 ORM, 它实现了数据库的面向对象, 但底层还是原生 sql, 解耦了数据模型与数据库的解耦, 通常在 Django 中表的定义一般在 models.py 文件中,减轻了开发人员因数据库变更而导致的无效劳动, 它提供了相关的命令(makemigratios\migrate)使得对数据库的映射和变更,model 层负责数据的存储, 对外提供强大的管理器供开发人员做一些列的增删改查操作,对于请求,视图会从对应的模型中获取必要的数据,django 底层翻译成相应的 sql 到数据库中去执行,从而返回数据或者创建数据, 但 orm 翻译成 sql 的过程本身也是影响了效率, 但是没有太大的损伤,最主要的我们怎么合理的去设计数据库,避免重复的数据库操作。
对于一个 wbe 请求, 数据库分配到的工作越多,数据库请求次数越少, 从而效率越高,避免循环中操作数据库, 杀死django性能最简单的方式就是在for循环中使用 query 单次的数据库请求是很快的, 但是多次请求就会严重影响效率。
多去扩展一些子查询 annotations 和 queryset ,可以大幅度提高你的 web 性能,传递给annotate函数的每个参数,都会以"注解"的形式添加到model queryset返回的每一个object里面。
应该做的事情:
关于数据库操作放到 model 中操作, 或者使用一些子查询

Templates 层

在目前的前后端分离的开发模式中,已经不使用这种模板渲染的方式了, 他是早期在 ajax 中经常使用的方式,模板不过是Django应用程序的前端组件。它包含网页的静态HTML输出以及动态信息。为了动态生成HTML,Django将模板语言和静态 HTML 结合起来, 后端提供数据, 前端负责把数据渲染出来,使得能够动态显示模型中的数据。

总结

  1. view 层做业务的增删改查, 避免做过多的其他逻辑或是循环查询
  2. model 层做数据的处理,和数据库有关的放到 model 中处理