1.为什么选用Django

为什么选用Django,从个人角度来看就是因为它简单,上手容易,等到用熟后再切换到其他的框架比如Nodejs,Spring Boot,无非就是换个语言,思想是可以共同的,这就是我选用Django的原因,那它的简单体现在哪里?

  1. 开发语言为Python简单,在IT界有句名言“人生苦短,我用python”,python简单吗?只能说上手容易,能够做的覆盖面广,一门语言到深入的时候都是困难的。
  2. 切换框架组件十分容易,换个数据库就只要修改个setting配置
  3. 集成的组件大而全,对我而言最为诱人的是它集成的Admin后台。

2.Django架构总览

说到Django的架构不得不提到MTV,大家可能听说过MVC MVVM MVP这些,其实MTV也可以看成MVC,那MTV分别代表什么呢?
M - Model 也就是 Django中的数据模型
T - Template 等同MVC中的V 也就是Django中的视图层
V - View 等同于MVC中的C 也就是Django中的控制层

我们就依靠下面的图来讲下整个请求处理流程:

  1. 请求源发起网络请求,这里以常见的GET/POST为例子,这里的请求源有很多,比如常见的浏览器,手机app
  2. 请求到达框架后首先会经过请求中间件的处理
  3. 经过中间件处理后的请求会发送到路由上进行路由分配,路由分配是将这些请求分配到各个View中。这些请求作为View的参数传递进去。
  4. 到达view后,在view中会从数据库中将数据取出来,封装成一个一个Model对象,使用这些对象来完成我们的任务,在这个过程中可能会返回文件系统,比如图片,音视频资源,然后将这些资源整合在一起,传递给Template
  5. 在Template层中会将从view层中传递过来的数据整合到界面上,渲染出来,形成一个response。
  6. 生成response后在送达到用户浏览器之前可能还会经过response 中间件处理后送达到用户浏览器。

3.WSGI uWSGI ngix

这里我们不涉及到部署方面的知识,这些会在后面专门章节进行介绍,这里只不过介绍下这些概念,让大家对整个服务端结构有个大体的认识,我们前面讲的是从一个web app角度来看的一个流程,下面我们介绍的是从一台服务器的角度来看这个问题,区别在哪里呢?一个服务器可以包含一个或者多个应用。那就多出了服务器与web app的一个交互过程。

首先我们简要介绍下用户通过浏览器访问网页,具体经过了哪些环节。

  1. 用户输入需要访问网站的url,浏览器将这些封装成符合http格式的Request请求,这个请求中可以包含请求首行、请求头和请求体这些内容。
  2. 上面的Request请求是应用层数据,要通过网络请求发送出去需要再由操作系统完成TCP、IP、MAC层封装,最终送到网卡以比特流形式传递出去。
  3. 经过网络传输,比特流到达服务器端,被服务器接收,服务器操作系统依次剥离MAC、IP、TCP层封装,取出应用层数据,也就是浏览器发送出的Request请求,并交给应用层的Web应用。
  4. Web 应用解析Request请求内容,并生成Respond响应,交给服务器
  5. Respond响应也是应用层数据,由服务器OS完成TCP、IP、MAC层封装,送到网卡处以比特流形式送出。
  6. 经过网络传输,包含resonse的比特流到达服务器端,被用户机器接收。
  7. 用户机器逐一去掉 MAC、IP、TCP层封装,取出应用层数据,也就是Respond响应,并交给应用层的浏览器。浏览器根据Response响应内容,显示在用户面前。

我们再看下下面这张图:

我们上面讲的内容是django 那个框,这个框的输入是一个request输出是一个response,我们必须注意到一点服务器操作系统和web app也是有交互的:服务器操作系统将Request请求传给Web APP,Web APP处理后,将Respond响应传给服务器操作系统,那么,服务器操作系统怎么把Request请求传给Web APP?这就涉及到了WSGI接口。WSGI接口其实是一个协议,一个规范是抽象的东西。这个接口连接了服务器操作系统和和Web APP。

一般我们讲到一个东西的必要性就会做出如下假设?如果没有这个东西情况会怎样?如果没有wsgi,那么服务器OS来了个请求后首先需要判断这个请求是发送给哪个web app,必须根据不同的web app类型调用不同的接口,通过不同的接口将request传递过去。这显然不合常规,那正常的做法是怎样呢?正常应该有个公共的协议,我们不关心具体的web framework的类型是啥,你是Django 也好,是Flask也要,只要你是符合wsgi接口的web框架,我都能保证调用同一个接口将request从服务器操作系统传递给web app。也就是保证了不同web框架对外的一致性。

那么ngix的作用是什么呢?nginx的功能十分强大,我们只关心它的请求分发的功能。谈到它需要将它与web app的路由进行对比,web app的路由是将到达app的请求,细分到各个响应函数进行处理,而nginx的作用是决定某个请求分发到哪个web app,也就是说,首先某个请求从一个端口进来,通过ngix将其分配到该台服务器上的某个web app上面,web app路由再将这些请求,细分到函数进行处理。大致是这样一个区别。不知道大家理解了没有。记住一个服务器有不止一个web app,这里的web app用的web框架不止有一种,假设来了个请求你要怎么在这些不同的web框架之间进行分配。理顺了这些问题就ok了。

Contents
  1. 1. 1.为什么选用Django
  2. 2. 2.Django架构总览
  3. 3. 3.WSGI uWSGI ngix