简述django请求生命周期_django更新数据库记录

简述django请求生命周期_django更新数据库记录Django请求生命周期分析1.客户端发送请求在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Django请求生命周期分析

简述django请求生命周期_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协议的话,如果本地没有证书和公钥,那么会从服务器获取证书并且进行验证,流程如下:
    简述django请求生命周期_django更新数据库记录
     

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中的中间件,注意:中间件的执行是有顺序的,所以我们一般自定义中间件的时候,我们都会将自定义的中间件放到列表最下面
简述django请求生命周期_django更新数据库记录
 

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请求的生命周期结束。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165788.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 每天一道算法_3_487-3279_对电话号码格式化统计批处理

    早上弄了一道求高精度幂的算法,偷懒用了内部类,总觉得过意不去,所以今天重新做了一道算法题,做完心里舒服好多。题目如下: Description企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GI

    2022年3月10日
    357
  • 数组转LIst的几种方法

    数组转LIst的几种方法第一种方式/***针对数组类型转换*分别是int[]、long[]、double[],其他数据类型比如short[]、byte[]、char[],在JDK1.8中暂不支持*/List<Integer>intList=Arrays.stream(newint[]{1,2,3,}).boxed().collect(Collectors.toList());List<Long>longList=Arrays.stream(newlong[]

    2022年6月21日
    27
  • 返回值是函数_void函数怎么用

    返回值是函数_void函数怎么用通常,希望通过函数使主调函数得到一个确定的值,这就是函数的返回值。说明:1、函数的返回值是通过函数的return语句获得的。(1)return语句将被调函数中的一个确定值带回主调函数中去。(2)

    2022年8月2日
    3
  • JS 中 scrollWidth、scrollHeight、scrollLeft 、scrollTop 详解

    JS 中 scrollWidth、scrollHeight、scrollLeft 、scrollTop 详解1.总述在JS中scrollWidth、scrollHeight、scrollLeft 、scrollTop属性在做一些复杂的交互效果中是非常常用的,因此在本博文中详细的介绍并给出实例。以上的4个属性是成对出现的,因此下面介绍中也成对的介绍,在实例中为了减少代码量,我直接用的id,实际开发中不推荐。2.scrollWidth和scrollHeight2.1概念element…

    2022年7月23日
    5
  • java 笛卡尔积_使用Guava来计算笛卡尔积

    java 笛卡尔积_使用Guava来计算笛卡尔积以前做项目的时候计算笛卡尔积的时候,总是使用各种for循环来嵌套,最后往往在Sonar代码检查的时候总是会报警说for循环嵌套过深。今天才知道Guava原来已经为我们提供了优雅的计算笛卡尔积的方法。比如我们要计算3个List的笛卡尔积,每个list的内容都是[‘a’,’b’,’c’],请看下面的代码:publicclassCartesianProductUtil{publicstat…

    2022年7月27日
    1
  • tcp工作原理三次握手_tcp三次握手为什么不是两次

    tcp工作原理三次握手_tcp三次握手为什么不是两次目录一、TCP协议二、TCP原理1,确认应答机制2,超时重传机制3,连接管理机制4,滑动窗口5,流量控制6,拥塞控制7,延迟应答8,捎带应答9,粘包问题一、TCP协议TCP,即TransmissionControlProtocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。TCP协议段格式源/目的端口号:表示数据是从哪个进程来,到哪个进程去;序列号:在建立连接时由计算机生成的随机数作为其初始值,通过

    2022年9月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号