Django中间件
目录
一.介绍
1.什么是Django中间件
2.作用:
3.示例
二.Django请求生命周期流程图
三.Django中间件是Django的门户
四.中间件方法
1.必须掌握的中间件方法
(1)process_request:
示例:
2.需要了解的中间件方法
(1)process_view
示例:
(2)process_template_response
示例:
(3)process_exception
示例:
五.自定义中间件
1.process_request
1.路由层
2.视图层
3.配置文件
4.自定义中间件
5.总结
(1)执行顺序
(2)没有定义process_request
(3)定义了返回值
(4)总结
2.process_response
3.小结
一.介绍
1.什么是Django中间件
- Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程
- 它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理
- 中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理
- 在Django的setting.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序
2.作用:
- 认证和授权:
- 中间件可以在请求到达视图之前进行用户认证和权限验证,确保只有经过授权的用户才能访问敏感资源
- 请求和响应处理
- 中间件可以在请求到达视图之前对请求进行预处理
- 例如添加请求头信息、检查请求参数的合法性等造作
- 同时,在视图函数返回响应给客户端之前,中间件还可以对响应进行后处理
- 例如添加额外的响应头、包装响应数据等操作
- 中间件可以在请求到达视图之前对请求进行预处理
- 异常处理:
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
- 例如记录异常日志、返回自定义错误信息等
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
- 性能优化:
- 通过中间件可以对请求进行性能检测,缓存处理、压缩响应等操作,提升网站的整体性能
3.示例
class MyMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 在视图函数调用之前的预处理逻辑# ...response = self.get_response(request)# 在响应返回给客户端之前的后处理逻辑# ...return response
二.Django请求生命周期流程图
- 客户端发出HTTP请求
- 请求被Web服务器接收并传递给Django应用程序
- Django中的WSGI中间件开始处理请求,并可进行一些预处理操作
- 中间件将请求传递给URL分发器(URL Dispatcher)
- URL分发器根据URL模式将请求路由到相应的视图函数或处理器(View/Handler)
- 视图函数或处理器执行相应的业务逻辑,可能会与数据库等外部资源交互
- 视图函数或处理器返回一个HTTP响应对象
- 响应对象经过中间件,可以在此进行后处理操作
- 响应被发送给Web服务器
- Web服务器将响应发送回客户端
三.Django中间件是Django的门户
- 请求发来的时候需要先经过中间件才能到达真正的Django后端
- 响应返回的时候,最后也需要进过中间件返回发送出去
四.中间件方法
Django支持程序员自定义中间件并且给程序员5个中间件
1.必须掌握的中间件方法
(1)process_request:
- 执行顺序
请求来的时候需要经过每一个中间件的process_request方法
结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的- 没有定义process_request
如果没有定义这个方法就跳过这个中间件- 定义了返回值
如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)- 总结
process_request方法就是用来做全局相关的所有限制功能
- 该方法在每个请求到达视图之前被调用,可以对请求进行预处理
- 例如,进行身份验证,访问控制或请求日志记录等操作
- 它接收一个HttpRequest对象和HttpResponse对象作为参数,并且必须返回一个HttpResponse对象
示例:
class CustomResponseMiddleware:def process_response(self, request, response):# 在这里对响应进行处理response['X-Custom-Header'] = 'Custom Value'return response
2.需要了解的中间件方法
(1)process_view
- 路由匹配成功后执行视图函数之前
- 会自动执行中间件里面的该方法
- 顺序是按照配置文件中注册的中间件从上而下的顺序执行
- 该方法在请求到达视图之前被调用,在视图函数执行前执行。
- 可以在此处进行一些操作
- 如修改请求参数或进行记录等。
- 它接收一个HttpRequest对象和一个视图函数作为参数,并且可以返回一个HttpResponse对象或None。
示例:
class LoggingMiddleware:def process_view(self, request, view_func, view_args, view_kwargs):# 在这里记录日志logger.info(f"Request received: {request.path}")# 返回None,继续执行原视图函数return None
(2)process_template_response
返回的 HttpResponse 对象有 render 属性的时候才会触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
- 该方法在视图函数返回一个TemplateResponse对象时调用。
- 可以在此处修改模板响应
- 例如添加全局的上下文数据或进行额外的渲染操作。
- 它接收一个HttpRequest对象和一个TemplateResponse对象作为参数,并且必须返回一个TemplateResponse对象。
示例:
class GlobalContextMiddleware:def process_template_response(self, request, response):# 在这里添加全局的上下文数据response.context_data['global_data'] = "Global Value"return response
(3)process_exception
- 当视图函数中出现异常的情况下触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
- 该方法在视图函数抛出异常时被调用。
- 可以在此处捕获异常并进行处理
- 例如返回一个定制的错误页面或进行日志记录等。
- 它接收一个HttpRequest对象和一个异常对象作为参数,可以返回一个HttpResponse对象来替代原始的异常响应。
示例:
class ErrorHandlerMiddleware:def process_exception(self, request, exception):# 在这里处理异常if isinstance(exception, CustomException):# 如果自定义异常,返回一个定制的错误页面return render(request, 'error.html', {'error': str(exception)})else:# 默认情况,返回一个500服务器错误return HttpResponseServerError("Internal Server Error")
五.自定义中间件
1.process_request
1.路由层
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/',views.index),
]
2.视图层
def index(request):print("这是视图函数index")return HttpResponse("index 的返回值")
3.配置文件
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',# 注册自己的中间件(在应用下创建路径会有提示,但是如果在项目下创建就没有提示,需要自己根据路径书写)'app01.mymiddle.my_middle.MyMiddle',# 谁先注册就先执行谁'app01.mymiddle.my_middle.MyMiddle2',
]
4.自定义中间件
# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("这是第一个自定义中间件中的 process_request 方法")class MyMiddle2(MiddlewareMixin):def process_request(self, request):print("这是第二个自定义中间件中的 process_request 方法")
5.总结
(1)执行顺序
- 请求来的时候需要经过每一个中间件的 process_request 方法
- 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
(2)没有定义process_request
- 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
- 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
(4)总结
- process_request 方法就是用来 做全局相关的所有限制功能
2.process_response
# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("这是第一个自定义中间件中的 process_request 方法")def process_response(self, request, response):''':param request: :param response: 就是Django返回给浏览器的内容:return: '''print("这是第一个自定义中间件中的 process_response 方法")# 必须返回 responserreturn response
-
响应被返回的时候需要结束每一个中间件里面的 process_response 方法
- 该方法有两个额外的参数
- request
- response
- 该方法有两个额外的参数
-
该方法必须返回 HttpResponse 对象
- 默认是response
- 支持自定义
-
顺序是按照配置文件中注册过的中间件从下往上依次经过
- 如果没有定义,则跳过,校验下一个
3.小结
-
如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?
- 会直接走同级别的 process_response 方法 ,然后直接返回
-
flask框架的中间件也有一个类似的方法
- 但是flask返回数据就必须经过所有中间件里面的 process_response 方法
相关文章:
Django中间件
目录 一.介绍 1.什么是Django中间件 2.作用: 3.示例 二.Django请求生命周期流程图 三.Django中间件是Django的门户 四.中间件方法 1.必须掌握的中间件方法 (1)process_request: 示例: 2.需要了解的中间件方法 &#x…...
redis运维(十九)redis 的扩展应用 lua(一)
一 redis 的扩展应用 lua redis如何保证原子操作 说明:引入lua脚本,核心解决原子性问题 ① redis为什么引入lua? lua脚本本身体积小,启动速度快 ② redis引入lua的优势 小结: 类似自定义redis命令 ③ redis中如何使用lua ④ EVAL 说明&#…...
SpringBoot——MVC原理
优质博文:IT-BLOG-CN 一、SpringMVC自动配置 SpringMVC auto-configuration:SpringBoot自动配置好了SpringMVC。以下是SpringBoot对SpringMVC的默认配置:[WebMvcAutoConfiguration] 【1】包括ContentNegotiatingViewResolver和BeanNameView…...
[Linux] shell条件语句和if语句
一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式:test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…...
【陈老板赠书活动 - 18期】-如何成为架构师这几本书推荐给你
陈老老老板🦸 👨💻本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 👨💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。 👨&am…...
chrome 插件 Mobile simulator
谷歌浏览器插件Mobile simulator v3.8.2.0-2023-4-27(做屏幕适应的前端工具)-(Chrome插件)谷歌浏览器插件网 百度网盘:https://pan.baidu.com/s/1xVyny8CtlMjSchhTIlfRAA 提取码:cj5c...
JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较
在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈详解 MERN 技术栈包含四大具体组件: MongoDB&am…...
【Vue】核心特性(响应式)
响应式: 数据变化,视图自动更新 接下来使用一个例子来体现一下什么是响应式 案例一: 访问数据,视图自动更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…...
ESP32 http 请求
目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…...
【C++】拷贝构造函数,析构函数详解!
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
qml ParticleSystem3D使用介绍
在 Qt Quick 3D 中,ParticleSystem3D 是用来创建和控制3D粒子系统的元素。粒子系统是图形编程中用于模拟液体、烟雾、火、星空等现象的技术,它通过生成大量小粒子来模拟这些效果。ParticleSystem3D 提供了一个框架,允许开发者定义粒子的各种属性,如生命周期、速度、颜色、大…...
集团投融资大数据平台解决方案
一、项目背景 项目为集团型公司大数据平台项目,整个项目周期约为6个月,整体呈现了对外的数据大屏驾驶仓和对内的看板报表,减少了客户内部数据上报和报表制作的重复工作量,为集团数据决策奠定基础。 二、项目目标 战略层ÿ…...
深信服技术认证“SCSA-S”划重点:渗透测试工具使用
为帮助大家更加系统化的学习网络安全知识,尽快通过深信服安全服务认证工程师认证,深信服推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师(…...
CCFCSP试题编号:201803-2试题名称:碰撞的小球
一、题目描述 二、思路 1.首先妾身分析这个题目,想要解题,得得解决2个问题。 1)判断小球到达端点或碰撞然后改变方向; 2)每时刻都要改变位置 两个问题都比较好解决,1)只要简单判断坐标&…...
《安富莱嵌入式周报》第327期:Cortex-A7所有外设单片机玩法LL/HAL库全面上线,分享三款GUI, PX5 RTOS推出网络协议栈,小米Vela开源
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 1、2023 Hackaday大赛胸牌开源 Vectorscope-main.zip (66.83MB) GitHub - Hack-a-Day/Vectorscope: Vectorscope badg…...
面试官:【js多维数组扁平化去重并排序】
文章目录 前言方法一方法二方法三方法四总结后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:JavaScript 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&a…...
C#编程题分享(3)
n的阶乘问题 输⼊整数n,输出n的阶乘。 int n Convert.ToInt32(Console.ReadLine()); int jiecheng 1; for (int i 1; i < n 1; i) {jiecheng * i; // 1 * 2 * 3 * .....} Console.WriteLine("{0}的阶乘是:{1}", n, jiecheng); q^n次…...
Redis下载和安装(Windows系统)
通过 GitHub 来下载 Windows 版 Redis 安装包,下载地址:点击前往。 打开上述的下载链接,Redis 支持 32 位和 64 位的 Window 系统,大家根据个人情况自行下载,如图 1 所示: 下载完成后,打开相应的文件夹&a…...
MySQL数据库:开源且强大的关系型数据库管理系统
大家好,我是咕噜-凯撒,数据在当今信息化时代的重要性不可忽视。作为企业和组织的重要资产,数据的管理和存储变得至关重要,MySQL作为一种关系型数据库管理系统,具有非常多的优势,下面简单的探讨一下MySQL数据…...
如何在AD的PCB板做矩形槽孔以及如何倒圆弧角
Altium Designer 22下载安装教程-CSDN博客 如何在AD上创建完整的项目-CSDN博客 开始前,请先安装后AD,并创建好项目。 目录 1. 如何在AD的PCB板做矩形槽孔 2. 如何在AD的PCB板倒圆弧角 1. 如何在AD的PCB板做矩形槽孔 首先,我们进入上面创…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
