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请求生命周期流程图

  1. 客户端发出HTTP请求
  2. 请求被Web服务器接收并传递给Django应用程序
  3. Django中的WSGI中间件开始处理请求,并可进行一些预处理操作
  4. 中间件将请求传递给URL分发器(URL Dispatcher)
  5. URL分发器根据URL模式将请求路由到相应的视图函数或处理器(View/Handler)
  6. 视图函数或处理器执行相应的业务逻辑,可能会与数据库等外部资源交互
  7. 视图函数或处理器返回一个HTTP响应对象
  8. 响应对象经过中间件,可以在此进行后处理操作
  9. 响应被发送给Web服务器
  10. Web服务器将响应发送回客户端

三.Django中间件是Django的门户

  • 请求发来的时候需要先经过中间件才能到达真正的Django后端
  • 响应返回的时候,最后也需要进过中间件返回发送出去

四.中间件方法

Django支持程序员自定义中间件并且给程序员5个中间件

1.必须掌握的中间件方法

(1)process_request:

  1. 执行顺序
            请求来的时候需要经过每一个中间件的process_request方法
            结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
  2. 没有定义process_request
            如果没有定义这个方法就跳过这个中间件
  3. 定义了返回值
            如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
  4. 总结
            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

  1. 路由匹配成功后执行视图函数之前
  2. 会自动执行中间件里面的该方法
  3. 顺序是按照配置文件中注册的中间件从上而下的顺序执行
  • 该方法在请求到达视图之前被调用,在视图函数执行前执行。
    • 可以在此处进行一些操作
    • 如修改请求参数或进行记录等。
  • 它接收一个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

  1. 返回的 HttpResponse 对象有 render 属性的时候才会触发

  2. 顺序是按照配置文件中注册了的中间件从下往上依次经过
  • 该方法在视图函数返回一个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

  1. 当视图函数中出现异常的情况下触发
  2. 顺序是按照配置文件中注册了的中间件从下往上依次经过
  • 该方法在视图函数抛出异常时被调用。
    • 可以在此处捕获异常并进行处理
    • 例如返回一个定制的错误页面或进行日志记录等。
  • 它接收一个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 方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新生儿散光:原因、科普和注意事项

引言: 散光是一种常见的眼睛问题,虽然在新生儿时期相对较少见,但了解其原因、科普相关知识,并提供一些建议的注意事项,对于婴儿的视力健康至关重要。本文将深入探讨新生儿散光的原因、相关科普知识,并为父…

大厂前沿技术导航

百度Geek说 - 知乎 腾讯技术 - 知乎 美团技术团队

YaRN方法:无需微调,高效扩展语言模型上下文窗口/蚂蚁集团与浙大发布原生安全框架v1.0,引领企业网络安全新时代 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 YaRN方法:无需微调,高效扩展语言模型上下文窗口 蚂蚁…

2023 hnust 湖南科技大学 信息安全管理课程 期中考试 复习资料

前言 ※老师没画重点的补充内容★往年试卷中多次出现或老师提过的,很可能考该笔记是奔着及格线去的,不是奔着90由于没有听过课,部分知识点不一定全,答案不一定完全正确 题型 试卷有很多题是原题 判断题(PPT&#xff…

python-冒泡排序

冒泡排序 (稳定) O(n^2) (稳定:表示相等的数,相对位置会不会改变) 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次遍历待排序的元素,比较相邻两个元素的大小并交换它们&…

Kafka 常用功能总结(不断更新中....)

kafka 用途 业务中我们经常用来两个方面 1.发送消息 2.发送日志记录 kafka 结构组成 broker:可以理解成一个单独的服务器,所有的东西都归属到broker中 partation:为了增加并发度而做的拆分,相当于把broker拆分成不同的小块&…

党建信息管理系统源码 支持在线交党费 附带完整的搭建教程

传统的党建管理模式通常采用手工方式,不仅效率低下,而且容易出错。随着组织规模的扩大和党员数量的增加,这种管理方式已经无法满足现实需求。此外,传统的党建管理模式缺乏在线交党费功能,给党员带来不便。因此&#xf…

Kubernetes 离线部署 Spinnaker

离线部署 Spinnaker 离线部署 spinnaker 需要提前准备以下依赖项 halyard 安装工具:该hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于国外halyard boms物料清单:Spinnaker 将其halyard boms配置存储在公共谷歌云存储 ( g…

Divisibility Trick

Dmitry最近学会了一个简单的规则来检查一个整数是否可以被3整除。如果一个整数的位数之和可以被3整除,那么它就可以被3所整除。 后来他还了解到,同样的规则也可以用来检查一个整数是否可以被9整除。如果一个整数的位数之和可以被9整除,那么它…

如何在 Web 应用程序中查找端点?

如何在 Web 应用程序中查找端点? 这篇文章主要讲述了如何在网络应用中找到端点。以下是文章的主要要点: 端点是网络服务的访问地址,通过引用这个URL,客户可以访问服务提供的操作。端点提供了寻址Web服务端点所需的信息。 HTTP消息是服务器和客户端之间交换数据的方式,包…

Anaconda深度学习环境配置命令参考

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Anaconda深度学习环境配置 Anaconda 管理1. 检查 Anaconda 版本2. 获取版本号3. 列出所有的虚拟环境4. 查看环境管理的全部命令帮助5. conda升级6. conda升级后释放空间 Anac…

2024免费MacBook清理工具CleanMyMac X4.15

CleanMyMac X 是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级 Mac 上的应用。同时 CleanMyMac X 可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化 Mac 系统&…

竞赛知识点12【树状数组】

文章目录 1、思路引入2、求lowbit(n)3、对某个元素进行加法操作(单点更新)4、查询前缀和5、统计A[x]~A[y] 的值1、思路引入 如果线段树每个节点维护的是对应区间的和,比如说计算从 s s s 到 t t t 的和 ( a s + … + a t ) (a_s+…+a_t) (as​+…+at​),在基于线段树的实…

【ChatGLM3-6B】Docker下部署及微调

【ChatGLM2-6B】小白入门及Docker下部署 注意:Docker基于镜像中网盘上上传的有已经做好的镜像,想要便捷使用的可以直接从Docker基于镜像安装看Docker从0安装前提下载启动访问 Docker基于镜像安装容器打包操作(生成镜像时使用的命令&#xff0…

Nginx常用负载均衡策略

Nginx常用负载均衡策略 轮询(默认) 注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要…

什么手机30万?VERTU唐卡手机顶配56.8万

近日,一则新闻在社交媒体上引发了广泛关注。一名男子遗失了一部价值30万的VERTU唐卡定制款手机,而一位女士在捡到这部手机后,误以为是一部普通的老年机,引发了种种误会。30万的手机是什么牌子?VERTU唐卡手机浮出水面 据了解,这部VERTU唐卡定制款手机是一款豪华的奢侈品定制手机…

2-Python与设计模式--前言

0-Python与设计模式–前言 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验, 考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言, 它是一种解决问题的思…

GoogleNet详解

一、亮点 AlexNet、VGG都只有一个输出层。googlenet有三个(其中两个是辅助分类层) 二、先看看Inception结构 1、Inception 之前的网络: AlexNet、VGG都是串行结构 Inception: 并行结构 上一层的输出同时传入四个并行结构&…

有了倾斜摄影,如何搭建一座智慧城市?

随着无人机航测、倾斜摄影等全新一代测绘信息技术方法的发展,可以迅速搜集制作精细化的城市三维模型,搭建城市地理信息基础服务架构。 近期都在重点关注的“智慧城市”究竟是什么,有什么重大作用,同时又面临着什么难关&#xff0c…

短剧付费变现小程序源码系统+开通会员+在线充值 附带完整的搭建教程

大家好啊,今天小编来给大家分享一款短剧付费变现小程序源码系统。近年来,随着互联网技术的飞速发展,短剧成为了一个备受瞩目的领域。短剧以其简洁、紧凑的故事情节和制作周期短、传播速度快的特点,成为了越来越多人的选择。然而&a…