Django请求生命周期分析

1.客户端发送请求

  1. 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都实现了HSTS机制,服务器自动从http协议重定向到https协议
  2. 在网页中点击超链接或javascript脚本进行url跳转,仅设置href='绝对路径',浏览器会自动使用当前url的协议、host和port,例如在https://tieba.baidu.com/index.html网页中,点击一个超链接/f?kw=chinajoy,会自动访问https://tieba.baidu.com/f?kw=chinajoy

2. 路由转发

  1. IP查找:因特网内每个公有IP都是唯一的,域名相当于IP的别名,因为我们无法去记住一大堆无意义的IP地址,但如果用一堆有意义的字母组成,大家就能快速访问对应网站
  2. DNS解析:通过域名去查找IP,先从本地缓存查找,其中本地的hosts文件也绑定了对应IP,若在本机中无法查到,那么就会去请求本地区域的域名服务器(通常是对应的网络运营商如电信),这个通过网络设置中的LDNS去查找,如果还是没有找到的话,那么就去根域名服务器查找,这里有所有因特网上可访问的域名和IP对应信息(根域名服务器全球共13台)
  3. 路由转发:通过网卡、路由器、交换机等设备,实现两个IP地址之间的通信。用到的主要就是路由转发技术,根据路由表去转发报文,还有子网掩码、IP广播等等知识点

3.建立连接

通过TCP协议的三次握手建立连接

4.传输报文

建立连接后,客户端会通过TCP依次、有序的发送一定大小的报文,其中包括了超时重传、阻塞窗口等等概念,用来保证数据包的完整、有序

  • http协议使用的明文传输,所有内容都是直接可读的
  • https协议是基于SSL/TLS加密,而SSL/TLS是基于TCP协议的,也就是http协议报文包装成TCP报文进行的加密,使用https协议的话,如果本地没有证书和公钥,那么会从服务器获取证书并且进行验证,流程如下:

5.nginx处理

当前django框架开发的web项目,主流使用的服务器架构是:nginx+uWSGI+django

nginx监听公网IP的某个端口,例如80,接收到请求后,分2种情况处理请求:

  1. 如果是静态资源(如javascript、css、图片等)的请求,那么nginx直接获取到该资源,返回给用户
  2. 如果是动态内容的请求,那么nginx就将请求转发到uWSGI,使用的协议一般都是uwsgi,性能最好

注意:

  • 有些reqeust会分多个数据包进行发送,nginx会缓存等待整个request接收完成才调用uWSGI
  • 如果使用的https,那么加密、解密都在nginx中进行处理

6.uWSGI处理

uWSGI监听本机IP的某个端口,例如3308,接收到nginx转发来的请求后,通过将http协议转换为WSGI协议,和django程序之间进行通信

7.WSGIHandler处理

当django接受到一个请求时,会初始化一个WSGIHandler,可以在项目下的wsgi.py文件进行跟踪查看:

class WSGIHandler(base.BaseHandler):
request_class = WSGIRequest def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.load_middleware() def __call__(self, environ, start_response):
set_script_prefix(get_script_name(environ))
signals.request_started.send(sender=self.__class__, environ=environ)
request = self.request_class(environ)
response = self.get_response(request) ......

它接受2个参数:

  • environ:是含有服务器端的环境变量
  • start_response:可调用对象,返回一个可迭代对象。

这个handler控制了从请求到响应的整个过程,首先的就是加载djangosettings配置,然后就是调用django的中间件开始操作

8.middleware中间件处理

django操作中间件,首先会调用process_request方法,该方法的作用是处理请求对象,它的参数是request,返回有2种情况

  • response:调用process_response列表处理
  • None:调用下一个中间件的process_request处理

返回response之后的中间件及其业务逻辑都不会处理,直接回返回给浏览器

返回None则表示会继续调用下一个中间件,处理下一个中间件中的逻辑

 

django项目默认有一些自带的中间件,如下:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

process_request会从上往下依次调用MIDDLEWARE中的中间件,注意:中间件的执行是有顺序的,所以我们一般自定义中间件的时候,我们都会将自定义的中间件放到列表最下面

9.URLConf路由匹配

通过urls.py文件中的 urlpatterns 配置找到对应的 视图函数或者视图类的方法,如果没有找到匹配的方法,那么就会触发异常,由中间件的process_exception 进行处理

process_exception:在视图函数或中间件处理过程抛出异常时调用

参数:

  • request:请求对象
  • exception:是处理过程中抛出的异常对象

返回:

  • response:之后的process_exception都不会触发,而是调用process_response处理
  • None:调用上一个中间件的process_exception处理

10.middleware的process_view

我们通过路由调用视图之前,会调用中间件的process_view方法进行预处理

process_view:视图预处理,在视图函数处理之前调用

参数:

  • view_func:url路由匹配到的视图函数
  • view_args:视图函数的可变参数
  • view_kwargs:视图函数的可变关键字参数

返回:

  • response:调用process_response处理
  • None:调用下一个中间件的process_view处理

11.views处理request

调用对应的视图函数或视图类的方法处理request,例如获取GETPOST参数,并且调用特定的模型对象执行数据库操作,如果没有数据库操作,那么就直接跳到我们后续的14步了

12.models处理

视图方法中,一般情况下都需要调用模型类进行数据操作,一般是通过模型的manager管理类进行操作的,如:MyModel.objects.get(pk=1)

如果没有数据操作,那么这一步和下一步就忽略

13.数据库操作

如果django通过模型类执行对数据库的增删改查,那么此时整个流程就会在对应的数据库中执行

14.views处理数据

​视图方法获取到数据后:

  • 将数据封装到一个context字典当中,然后调用指定的template.html,通过模板中的变量、标签和过滤器等,再结合传入的数据context,会触发中间件的process_template_response方法,最终渲染成HttpResponse
  • 不调用模板,直接返回数据,譬如 JsonResponseFileResponse
  • 执行redirect,生成一个重定向的HttpResponse,触发中间件的process_response后,返回到客户端,结束该web请求的生命周期

15.middleware的process_response

调用中间件的 process_response 方法进行处理,最后一个中间件的process_response执行完成后,返回到WSGIHandler类中

16.WSGIHandler处理

WSGIHandler类获取到response后

  • 先处理response的响应行和响应头,然后调用 start_response 返回http协议的 响应行和响应头 到uWSGI,这个 start_response 只能调用一次
  • 第一步处理完成后,如果是文件需要对response进行,否则就直接将response作为http协议的body部分返回给uWSGI

17.uWSGI处理

uWSGI接收到django程序的返回后,将所有内容包装成http协议的内容后,通过uwsgi协议返回给nginx服务器处理

18.nginx处理

nginx获取到uWSGI的返回后,将response通过TCP协议返回给客户端

19.客户端接收响应

客户端接收到服务器的响应后,做对应的操作,例如:显示在浏览器中,或是javascript的处理等至此,整个web请求的生命周期结束。

Django(35)Django请求生命周期分析(超详细)的更多相关文章

  1. Django(47)drf请求生命周期分析

    前言   一般我们写完序列化以后,我们就会开始写视图了,drf中我们一般使用CBV的方式,也就是类视图的方式,最基础的我们会使用from rest_framework.views import API ...

  2. Django简介,请求生命周期,静态文件配置

    Web框架 ​ Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  3. drf框架概况-resful接口规范-请求模块-渲染模块-Postman-drf请求生命周期

    drf框架 全称:django-rest- framework 知识点: """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码-基于restful ...

  4. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  5. DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render

    DRF框架    全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...

  6. Django组件 - Django请求生命周期、中间件

    一.Django请求生命周期 在学习中间件之前,先了解一下Django的请求生命周期,如下图: 1)client代表浏览器,浏览器内部为我们封装了socket,Django的WSGI模块也封装了soc ...

  7. Django组件---Django请求生命周期和中间件

    Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...

  8. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  9. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

随机推荐

  1. irreader网页订阅

    flag:立刻阅读,订阅你的全世界 订阅网页.RSS和Podcast,具备急速的阅读体验,高品质.免费.无广告.多平台的阅读器.泛用型Podcast播放器. 下载位置:http://irreader. ...

  2. Day07_35_Colection下的方法

    Collection 下的方法 * **Collection 集合的方法应用** ``` package com.shige.Collection; import java.util.ArrayLis ...

  3. vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

    目录 1,前言 2,.env文件的作用 3,配置.env文件 4,配置启动命令 5,获取.env中的全局变量 5,实际用处 1,前言 分享一下vue项目中利用.env文件存储全局环境变量,以及利于项目 ...

  4. 1035 Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  5. SpringIOC框架简单实现(注解实现)

    SpringIOC框架简单实现(注解实现) 前情回顾 SpringIOE简单介绍 运用注解的方式来实现IOC 首先,让我们来创建一个Dog类 @Component("dog")// ...

  6. 【vim】复制粘贴相关操作

    复制: 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了. 其他命令模式下剪切命令: yy:复制当前行 nyy:n表示大于1的数字,复制n行 yw:从光标处复 ...

  7. C/C++ 实现多线程与线程同步

    多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同 ...

  8. XCTF-ics-04

    ics-04 题目描述 工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag. 解题过程 拿dirsearch扫一波,没有什么有用的东西 注册个账号,登陆被提示普通用户登录成功,没什么用 登陆 ...

  9. Andrew Ng机器学习算法入门(二):机器学习分类

    机器学习的定义 Arthur Samuel给出的定义,Field of Study that gives computers the ability to learn without being ex ...

  10. 【CSS】CSS3从入门到深入(复习查漏向

    CSS3从入门到深入(复习查漏向 pre_section CSS:层叠样式表,决定网页表现 网页为多层结构,CSS为每一层设置样式,最后显示最上一层 CSS语句 = 选择器 + 声明块 形式 内联样式 ...