Django请求的生命周期
Django请求的生命周期是指:
当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。
直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。
一个完整的Django生命周期:
- 用户从客户端发出一条请求以后,首先会基于http协议去解析数据并封装,
- 然后来到Nginx处理(nginx监听公网ip的某个端口,接到请求后,如果是静态资源,nginx直接获取该资源并返回给用户,如果是动态资源,nginx就将请求转发到uWSGI,使用协议一般是uwsgi),
- uWSGI接收到请求以后,通过将http协议转化为WSGI协议,和Django之间进行通信,
- 此时,该条请求就真正的来到了后端之上,首先它会经过Django的第一道工序:中间件,(而所谓中间件,简单来说就是请求来和请求走的时候Django增加的一道工序,请求来和请求走的时候都要先经过中间件的处理,因此,也可以将中间件理解为Django提供的额外功能组件),
- 在经过中间件以后,来到Django的第二道工序:路由层(urls.py)去筛选匹配符合符合请求命令后缀的地址,
- 然后根据匹配到的地址去Django的第三道工序:视图层(views.py)找到对应的视图函数/视图类里的属性,
- 之后去到第四道工序:模型层(models.py)通过orm操作去数据库中获取数据,拿到数据以后回到视图层(views.py)里对数据进行处理(序列化和反序列化),
- 将处理后的数据返给Django的第五道工序:模板层(Templates),模板层接收到数据后,对数据进行渲染,之后再次经过视图层、路由层、中间件、uWSGI服务器、Nginx代理,
- 最后将渲染的数据返还给客户端进行展示。
浏览器向django服务器发起请求
路由系统(url.py)
- 通过正则匹配url
- 交由视图系统(views.py),调用对应的方法处理数据
中间件
- 全局生效(所有方法均需要先由中间件处理)
视图系统(views.py)
- 是否需要根据post get请求, 区分处理方式
- 处理数据
- 返回结果
templates
- 直接返回页面
- 数据处理后返回页面
层层返回给浏览器
简单的说就是:django的生命周期是:前端请求—>nginx—>uwsgi.—>中间件—>url路由---->view视图—>orm---->拿到数据返回给view---->视图将数据渲染到模版中拿到字符串---->中间件—>uwsgi---->nginx---->前端渲染。
Django 请求的生命周期主要分为如下四个阶段:
- WSGI 应用的初始化
- URL 路由匹配
- Django View 函数的执行
- 返回响应
接着,我们将逐一对这四个阶段进行详细讲解。
- WSGI 应用的初始化
当 WSGI 服务器启动 Django 应用程序时,将调用 Django 的自带 WSGI 应用程序处理器将应用程序加载到内存中,并在内存设定一些全局变量,如 settings,middleware 等。这些全局变量可以由 Django 应用程序和应用程序的中间件共同使用。
其中,settings 是 Django 应用程序中最重要的全局变量。它包含了除了 URL 路由跳转之外的所有应用程序配置信息,例如本地数据库 URL,模板引擎设置,调试开关等。middleware 则是一个提供额外功能的组件,可以对视图函数的请求和响应进行扩展。
以下是 WSGI 应用的初始化的代码段:
def get_wsgi_application():django.setup(set_prefix=False)return WSGIHandler()
get_wsgi_application() 函数用于实例化一个 WSGI 应用程序对象,并返回 WSGI 请求处理器对象。Django 在这里进行重要的初始化操作。
- URL 路由匹配
一旦 WSGI 应用程序在内存中设置好了,它将自动提供视图,即 URL 映射到相应的处理程序。在 Django 中,URLs 通过一个名为 urls.py 的文件进行定义和管理。当一个客户端请求到达 Django 时,它将映射到 urlpatterns 变量中的可调用视图函数上。
以下是一个 URL 映射器的示例:
from django.urls import path
from . import viewsurlpatterns = [path('about/', views.about),path('contact/', views.contact),
]
在这里,URL “/about/” 和 “/contact/” 路径将使用 views.about 和 views.contact 函数来处理请求。
在匹配 URL 时,Django 会按顺序依次尝试匹配每个 URL 规则,并使用第一个匹配的 URL 规则。如果没有规则匹配请求的 URL 路径,则 Django 允许你定义一个捕获所有情况的通配符 URL 规则,即使用 path() 函数的 ‘path:’ 参数。
urlpatterns = [path('about/', views.about),path('contact/', views.contact),path('<path:slug>/', views.page_not_found),
]
在这个示例中,Django 将试图匹配 “/about/” 和 “/contact/”,但无论它们能否成功匹配,最终都会跳转到 views.page_not_found 函数上。
- Django View 函数的执行
如果 Django 能够正确地将请求 URL 映射到一个视图函数上,则该视图函数将被执行。视图函数是 Django MVC 模型中的控制器,它处理请求并返回响应。
以下是一个视图函数的示例:
from django.shortcuts import renderdef index(request):return render(request, 'index.html')
在这个示例中,index 视图函数将会渲染 index.html 模板,并将结果用 HTTP 响应的形式返回给客户端。
Django 将请求对象作为视图函数的第一个参数传递,并在对象中提供了用于访问请求数据和其他属性的方法和属性。视图函数还可以访问请求参数和其他内置对象(如 settings 和 middleware)。
- 返回响应
当视图函数处理请求,并生成响应后,Django 将响应发送回客户端(通常是浏览器)。响应的内容都可以是可选的,Django 可以生成基于文本(HTML,JSON,XML 等)的响应,或者基于非文本(例如使用文件响应)的响应。
Django 提供了一组给用户访问的响应对象,并允许定制 HTTP 响应头。默认情况下,Django 使用 HttpResponse。HttpResponse 接受以下两类参数:
- content(必选项) - 由视图函数生成的一个字符串。
- content_type(可选项) - 此响应的内容类型,如 ‘text/html’ 或 ‘application/json’。
相关文章:

Django请求的生命周期
Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后ÿ…...
Kotlin 中 OkHttp 使用及解析
build.gradle dependencies {//OkHttpimplementation com.squareup.okhttp3:okhttp:4.9.0 } 简单使用例子 val okHttpClient OkHttpClient.Builder().connectTimeout(Duration.ofSeconds(10)).readTimeout(Duration.ofSeconds(10)).writeTimeout(Duration.ofSeconds(10)).re…...

【C++代码】用栈实现队列,用队列实现栈--代码随想录
队列是先进先出,栈是先进后出。卡哥给了关于C方向关于栈和队列的4个问题: C中stack 是容器么? 使用的stack是属于哪个版本的STL? 使用的STL中stack是如何实现的? stack 提供迭代器来遍历stack空间么? …...

肖sir__linux详解__001
linux详解: 1、ifconfig 查看ip地址 2、6版本:防火墙的命令: service iptables status 查看防火墙状态 service iptables statrt 开启防火墙 service iptables stop 关闭防火墙 service iptables restart 重启防火墙状态 7版本: systemctl s…...

【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析
1 RecyclerView简介 RecyclerView是一款非常强大的widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…...

P1886 滑动窗口 /【模板】(双端队列)+双端队列用法
例题 有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1,3,−1,−3,5,3,6,7],and k3。 输入格式 输入一共有两行…...

网络渗透day6-面试01
😉 和渗透测试相关的面试问题。 介绍 如果您想自学网络渗透,有许多在线平台和资源可以帮助您获得相关的知识和技能。以下是一些受欢迎的自学网络渗透的平台和资源: Hack The Box: Hack The Box(HTB)是一个受欢迎的平…...
Docker 及 Docker Compose 安装指南
Docker 是一个开源的容器化平台,可以帮助我们快速构建、打包和运行应用程序。而 Docker Compose 则是用于管理多个容器应用的工具,可以轻松定义和管理多个容器之间的关系。现在,让我们开始安装过程吧! docker 安装 apt安装 sudo…...

Gitlab创建一个空项目
1. 创建项目 Project slug是访问地址的后缀,跟前边的ProjectUrl拼在一起,就是此项目的首页地址; Visibility Level选择默认私有即可,选择内部或者公开,就会暴露代码。 勾选Readme选项,这样项目内默认会带…...

C语言-内存分布(STM32内存分析)
C/C内存分布 一、内存组成二、静态区域文本段 (Text / 只读区域 RO)已初始化读写数据段(RW data -- Initialized Data Segment)未初始化数据段(BSS -- Block Started by Symbol) 三、动态区域堆(…...
Linux上配置NAT
Linux系统上实现NAT上网是一个挑战性的任务,需要对操作系统进行合理的配置。本文将概述在Linux上实现NAT上网,并给出相应的工作步骤。 NAT,即Network Address Translation,是一种网络部署技术,可以在peivate network&…...
springboot实现简单的消息对话
目录 一、前言 二、实战步骤 步骤 1: 步骤 2: 步骤 3: 步骤 4: 一、前言 要在Spring Boot项目中实现消息对话,你可以使用WebSocket技术。WebSocket是一种在客户端和服务器之间提供实时双向通信的协议。 二、实…...
「Tech初见」Linux驱动之blkdev
目录 一、Motivation二、SolutionS1 - 块设备驱动框架(1)注册块设备(2)注销块设备(3)申请 gendisk(4)删除 gendisk(5)将 gendisk 加入 kernel(6&a…...
ssh配置(二、登录服务器)
一. 登录 linux 服务器的两种方式 使用 ssh用户名密码 的方式登录,但这种方式不安全,密码太简单容易被暴力破解,密码太复杂又不容易记。使用 ssh公私钥 的方式登录。 以上两种方式都可以在图形化软件工具中配置,例如 finalshell…...

pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...
文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width),但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此,需要对输入张量进行转置。 注意…...

【FPGA项目】沙盘演练——基础版报文收发
第1个虚拟项目 前言 点灯开启了我们的FPGA之路,那么我们来继续沙盘演练。 用一个虚拟项目,来入门练习,以此步入数字逻辑的…...

【C++技能树】继承概念与解析
Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…...

计算机网络 第二节
目录 一,计算机网络的分类 1.按照覆盖范围分 2.按照所属用途分 二,计算机网络逻辑组成部分 1.核心部分 (通信子网) 1.1电路交换 1.2 分组交换 两种方式的特点 重点 2.边缘部分 (资源子网) 进程通信的方…...

无涯教程-机器学习 - 矩阵图函数
相关性是有关两个变量之间变化的指示,在前面的章节中,无涯教程讨论了Pearson的相关系数以及相关的重要性,可以绘制相关矩阵以显示哪个变量相对于另一个变量具有较高或较低的相关性。 在以下示例中,Python脚本将为Pima印度糖尿病数…...
Redis 高可用与集群
Redis 高可用与集群 虽然 Redis 可以实现单机的数据持久化,但无论是 RDB 也好或者 AOF 也好,都解决 不了单点宕机问题,即一旦单台 redis 服务器本身出现系统故障、硬件故障等问题后, 就会直接造成数据的丢失,因此需要…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...