Python web实战之细说Django的中间件

                 


🔑 关键词:Python Web 开发、Django、中间件

今天分享Python Web开发中的一个重要成员:Django的中间件。介绍中间件的概念、作用及其在实战中的应用。

1 什么是中间件

在Python Web开发中,中间件(Middleware)是指位于Web应用程序和Web服务器之间的一层软件组件。它能够拦截请求和响应,进行一系列的处理操作,然后将请求传递给下一个中间件或视图函数。

中间件的作用类似于一个过滤器,可以对请求和响应进行定制化处理,实现各种功能需求。

1.1 Django中间件原理

Django中间件的原理是基于一个称为"请求/响应处理"的概念。当一个请求到达Django应用程序时,它将依次通过中间件组件,然后传递给相应的视图函数进行处理。在处理响应时,中间件组件将再次按照相反的顺序进行处理。

Django中的中间件是一个Python类,它实现了特定方法来处理请求和响应。以下是中间件类可能包含的方法:

  • init(self, get_response): 这是中间件类的构造方法,其中get_response参数是一个可调用的对象,表示后续的中间件或视图函数。

  • call(self, request): 这个方法在每次请求到达时被调用。它接收一个request参数,表示当前的请求对象。在这个方法中,你可以编写请求处理的逻辑,并决定是否将请求传递给下一个中间件或视图函数。

  • process_view(self, request, view_func, view_args, view_kwargs): 当一个视图函数被调用之前,这个方法将被调用。你可以在这里执行与视图函数相关的逻辑。

  • process_exception(self, request, exception): 当视图函数抛出异常时,这个方法将被调用。你可以在这里处理异常并返回相应的响应。

  • process_response(self, request, response): 当一个响应返回时,这个方法将被调用。你可以在这里对响应进行后处理,例如添加响应头或修改响应内容。

Django中间件的执行顺序是由MIDDLEWARE设置中的顺序决定的。这个设置位于 Django 项目的设置文件(settings.py)中。

下面是一些配置中间件执行顺序的方法:

  • 1. 在设置文件中按照顺序列出中间件类的路径:

   MIDDLEWARE = ['middleware1','middleware2','middleware3',]
  • 2. 使用中间件类路径和参数的元组形式,以便进行更高级的配置:

   MIDDLEWARE = [('middleware1', {'option': value}),('middleware2', {'option': value}),'middleware3',]

这种方式允许你为每个中间件指定特定的参数,从而更灵活地配置中间件。

中间件按照它们在列表中的顺序依次执行,直到达到最后一个中间件或一个中间件返回响应为止。然后,中间件将按相反的顺序再次执行,对响应进行后处理。

通过编写自定义中间件,你可以在请求和响应处理过程中添加自定义逻辑,实现身份验证、日志记录、性能优化等功能。同时Django还提供了一些内置的中间件,例如身份验证中间件、CSRF中间件等。

1.2 中间件的常见用途

中间件在Web开发中起着至关重要的作用。它具有以下几个方面的功能:

  1. 请求和响应处理:中间件可以对请求和响应进行预处理和后处理,例如修改请求头、添加响应头等。

  2. 身份验证:中间件可以实现用户身份验证的逻辑,例如检查用户是否登录、验证访问权限等。

  3. 性能优化:中间件可以进行性能监控、缓存优化、请求压缩等操作,提升Web应用的性能。

  4. 错误处理:中间件可以捕捉异常、记录日志,并对错误进行处理和反馈给用户。

  5. 数据分析:中间件可以收集和分析请求数据,用于统计和监控Web应用的使用情况。

  6. 安全性:中间件可以在请求和响应中加入安全措施,例如防止跨站脚本攻击(XSS)、CSRF攻击等。

2 Django中的中间件实战

现在通过几个应用场景来深入了解Django中的中间件是如何工作的。

2.1 访问日志中间件

访问日志是Web应用开发中非常重要的一部分,它记录了用户的访问行为,有助于调试bug,分析用户行为和优化网站性能。我们可以编写一个访问日志中间件,来记录用户每次请求的详细信息,并将其保存到日志文件中。

下面是一个简化的访问日志中间件示例:

import loggingclass AccessLogMiddleware:def __init__(self, get_response):self.get_response = get_responseself.logger = logging.getLogger('access')def __call__(self, request):# 处理请求前的逻辑self.logger.info(f"User {request.user} is accessing {request.path}")response = self.get_response(request)# 处理响应后的逻辑return response

在上面的代码中,我们定义了一个AccessLogMiddleware类,它接收一个get_response参数,在实例化时保存下来。get_response参数是一个可调用对象,表示后续中间件或视图函数。

__call__方法中,我们可以编写处理请求和响应的逻辑。例如,我们使用logging模块创建了一个名为access的日志记录器,并在每次请求时记录用户的访问信息。将这个中间件添加到Django的中间件列表中,就可以在整个应用程序中记录访问日志了。

2.2 身份验证中间件

身份验证是Web应用中常见的功能之一。我们可以使用Django的身份验证中间件来实现用户登录验证、权限检查等功能。

下面是一个简单的身份验证中间件示例:

from django.shortcuts import redirectclass AuthenticationMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):if not request.user.is_authenticated:return redirect('login')response = self.get_response(request)return response

在上面的代码中,我们定义了一个AuthenticationMiddleware类,它在每次请求到达时检查用户是否已经登录。如果用户未登录,则将其重定向到登录页面。将这个中间件添加到Django的中间件列表中,就可以实现简单的身份验证功能。

3 技术总结

本文详细介绍了中间件的概念、作用以及在实战中的应用。通过实例代码的演示,展示了访问日志中间件和身份验证中间件的使用方法。通过中间件,开发者可以在请求到达视图函数之前或响应返回给客户端之前对其进行预处理或后处理。

中间件的意义在于提供了一种可插拔的机制,使开发者能够轻松地添加、配置和重用功能模块,从而提高开发效率和代码可维护性。

文章的内容若对您有所帮助,欢迎点赞收藏转发,感谢。

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

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

相关文章

vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

问题描述 vue2中refs获取不到子组件中的方法?,而获取到的是undefined 原因及解决方案: 第一种、在循环中注册了很多个ref 因为注册了多个ref,获取是不能单单知识refs.xxx,需要使用数组和索引来获取具体一个组件refs[…

yolov5目标检测多线程C++部署

C多线程复习 下面的代码搭建了简单的一个生产者-消费者模型&#xff0c;在capture()函数中进行入队操作&#xff0c;infer()函数中进行出队操作&#xff0c;为了模拟采图-推理流程&#xff0c;在函数中调用Sleep()函数延时。 #include <iostream> #include <string&…

Rabbitmq的消息确认

配置文件 spring:rabbitmq:publisher-confirm-type: correlated #开启确认回调publisher-returns: true #开启返回回调listener:simple:acknowledge-mode: manual #设置手动接受消息消息从生产者到交换机 无论消息是否到交换机ConfirmCallback都会触发。 Resourceprivate Rabb…

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…

【Spring专题】Spring之底层架构核心概念解析

目录 前言前置知识课程内容一、BeanDefinition&#xff1a;图纸二、BeanDefinitionReader&#xff1a;图纸读取器——Spring工厂基础设施之一2.1 AnnotatedBeanDefinitionReader2.2 XmlBeanDefinitionReader2.3 ClassPathBeanDefinitionScanner 三、BeanFactory&#xff1a;生产…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

Jmeter-获取接口响应头(Response headers)信息进行关联

文章目录 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联使用正则表达式提取器将Set-Cookie的值提取出来在其余接口中关联该提取信息运行查看关联是否成功 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联 获取某一…

重发布选路最佳实验

题目 IP地址配置 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; 双点重发布 R2&#xff1a; rip 1 version 2 network 12.0.0.0 network 2.0.0.0 import-route ospf 1 ospf 1 import-route rip 1 route-policy R2 area 0.0.0.0 network 23.1.1.0 0.0…

ElasticSearch:环境搭建步骤

1、拉取镜像 docker pull elasticsearch:7.4.0 2、创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasti…

腾讯云COS的快速接入

背景 最近在研究一个剪贴板粘贴工具&#xff0c;实现粘贴图片&#xff0c;返回可访问的地址&#xff0c;这个在我的哔哩哔哩上有出一期视频&#x1f92d;。但是&#xff0c;我发现部分博客平台不能正常的转载我的图片链接&#xff0c;于是研究了一下腾讯云的COS&#xff08;阿…

linux程序保护机制gcc编译选项

预备知识&#xff1a; 计算机内存的结构通常包括以下几个主要部分&#xff1a; 1.代码段(Code Segment)&#xff1a;也称为文本段&#xff0c;存储程序的可执行指令。代码段是被标记为可执行的&#xff0c;程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中&#xff0c;我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法&#xff0c;例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中&#xff0c;我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

OpenStack监控工具

OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。由NASA和Rackspace合作研发并发起&#xff0c;以Apache许可证&#xff08;Apache软件基金会发布的一个自由软件许可证&#xff09;授权。 OpenStack为私有云和公有云提供可扩展的弹性的云计算…

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 &#xff08;一&#xff09;Cadvisor Cadvisor 产品特点&#xff1a; &#xff08;二&#xff09;InfluxDB InfluxDB应用场景&#xff1a; InfluxDB主要功能&#xff1a; InfluxDB主要特点&#xff1a; &#xff08;三&#…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

深度解读|一站式ABI平台 Smartbi Insight V11 能力再升级

纵观过去&#xff0c;我们发现汽车和BI的发展有异曲同工之妙。 100来年&#xff0c;汽车的动力从蒸汽到燃油再到新能源&#xff0c;汽车的操控方式从手动到自动再到智能无人驾驶。而在BI领域&#xff0c;自1958年BI的概念提出后&#xff0c;底层数据准备从报表开发、Cube多维模…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型&#xff08;本文所阐述的分支模型&#xff09;构思于 2010 年&#xff0c;也就是 Git 诞生后不久&#xff0c;距今已有 10 多年。在这 10 多年中&#xff0c;Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里&#xff0c;Git 本身…

最大子数组和【力扣53】

一、解题思路 Max[i]表示&#xff1a;以nums[i]为开头的所有连续子数组和的最大值。 由此可以推出Max[i-1]和Max[i]的关系&#xff1a; 若Max[i]>0&#xff1a;Max[i-1]nums[i-1]Max[i]&#xff1b; 否则&#xff1a;Max[i-1]nums[i-1]&#xff1b; 则ansMAX&#xff0…

RISC-V走向开放服务器规范

原文&#xff1a;RISC-V Moving Toward Open Server Specification 作者&#xff1a;Agam Shah 转载自&#xff1a;https://www.hpcwire.com/2023/07/24/risc-v-moving-toward-open-server-specification/ 中文翻译&#xff1a; 2023年7月24日 RISC-V International目前正…