python middleware_Django组件之Middleware

python middleware_Django组件之Middleware一 中间件在 django 的 settings py 文件下 有一个变量为 middleware 里面放的就是中间件 middleware django middleware security securitymidd django contrib sessions middleware sessionmiddl django middleware common co

一、中间件

在django的settings.py文件下,有一个变量为middleware,里面放的就是中间件。

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’,

]

上面就是django自带的7个中间件,我们想看中间件长什么样子,只需要复制中间件,用from引入,点进去看就可以了。

比如看第二个中间件:from django.middleware.sessions.middleware import sessionmiddleware,看到的结果如下:

class sessionmiddleware(middlewaremixin):

def __init__(self, get_response=none):

self.get_response = get_response

engine = import_module(settings.session_engine)

self.sessionstore = engine.sessionstore

def process_request(self, request):

session_key = request.cookies.get(settings.session_cookie_name)

request.session = self.sessionstore(session_key)

def process_response(self, request, response):

。。。。。。

我把process_response()方法下的东西省略了。但我们可以清楚的看出它就是一个继承于middlewaremixin的类。

所谓的中间件,就是存在于socket和视图函数中间的一种过滤器。浏览器客户端通过socket发送请求来,要经过一层层中间件的process_request()方法,在进入视图,视图函数执行完毕后,又要经过一层层中间件的process_response()方法,然后再通过socket发送给浏览器客户端。django服务器端的socket是由wsgiref模块封装而成的,它还帮我们把原生的数据解析成了request对象,从而在django服务器端才可以用request对象去拿值。

中间件有四个方法,分别是:

1,process_request(self,request)

2,process_response(self, request, response)

3,process_view(self, request, callback, callback_args, callback_kwargs)

4,process_exception(self, request, exception)

现在我们一个一个的来分析每个方法的运用及效果,四个方法讲完了,中间件就学完了。

二、process_request(),process_response()

上面我们说了,浏览器发送请求过来,会经过一层层的process_request,具体来说,会从最上面的中间件到最下面的中间件。执行完视图函数之后,会从从下往上执行每个中间件的process_response(),之后再发送给浏览器。

58eac5c4039eb256a94b95e5c77f79f5.png

通常情况下,process_request()是不会写return的,一旦某个中间件的process_request()写了return,那后面的中间件的process_request()就不会执行了,也不会到视图函数了,直接从自己的process_response()依次往上返回。

936a2791823b38bc4113a3c76e66c764.png

通常情况下,process_response()都要写上return response。一旦有一个中间件的process_response()没有写return response,那么数据走到这一个中间件时,数据就会丢失,后面要执行的中间件的process_response()都会没有数据。

三、process_views()

上面的第二点的执行流程是基于只有request和response的情况下的,如果加上了process_views()。首先还是先走每个中间件的request,然后走到urls.py文件,但现在不会马上去执行视图,而是先要从上往下走每个中间件的process_views(),走完之后再走视图函数,再走每个中间件的response。

215be00f886d609efcc12833acf26db4.png

第一步是process_request,第二步是process_views,第三步是执行视图函数,第四步是process_response

通常情况下,process_views 也不要加return httpresponse(‘fff’),一旦加上了,从这个中间件以下的中间件的process_views就不会执行,视图函数也不会执行。直接跳到最下面中间件的response开始返回。

52a2645319a4f8dc9c8d5613d79b7079.png

第一步是process_request,第二步是走部分的process_views,第三步是process_response

process_views()方法还可以写上回调视图函数,它会把对应的视图函数给执行了,然后返回

def process_view(self,request,callback,callback_args,callback_kwargs): response=callback(request,*callback_args,callback_kwargs)

#callback就是在经过urls.py时对应的视图函数,现在直接在process_views()直接回调视图函数,并且执行

return response

这种情况下,会在执行这个中间件的process_views,把对应的视图函数也一起执行了,然后就直接到最下面中间件从下往上执行response,返回

b1c20cc463effa06355252adc9c5082f.png

第一步是prosee_request,第二步是走部分的process_views,第三步是执行process_views里的回调视图函数,第四步是process_response

四、process_exception()

上面的执行流程是基于没有process_exception()情况下的,加上process_exception(),在执行完视图函数之后,后从下往上执行中间件的process_exception(),然后在从下往上执行中间件的response,然后返回。process_exception()的作用是捕获视图函数的错误。

d9dc8e116b15964b7f876f070888790e.png

第一步是process_request,第二步process_views,第三步执行视图函数,第四步process_exception,第五步是process_response.

五、自定义中间件

在全局创建一个文件夹middlewares,在里面创建一个m1.py

from django.utils.deprecation import middlewaremixin

class m1(middlewaremixin):

def process_request(self,request):

print(‘m1.process_request’)

def process_view(self,request,callback,callback_args,callback_kwargs):

print(‘m1.process_view’)

response=callback(request,*callback_args,callback_kwargs)

return response

def process_response(self,request,response):

print(‘m1.process_response’)

return response

记得在settings.py下的middleware加上’middleware.m1’,如下

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’,

‘middleware.m1’,

]

这样,每次请求进来都会走你的中间件的process_request(),执行完视图函数后,都会走你的中间件的process_response()。

当我们多数的视图函数都要进行一个操作时,我们就可以考虑自定义一个中间件,把要执行的操作放在里面就可以不用再每个视图里面再写这些代码了。

但只有一小部分视图函数要进行某一操作,我们可以考虑自定义一个装饰器,然后在需要这操作的视图函数上面写上语法糖,也可以解决代码复用的效果。

希望与广大网友互动??

点此进行留言吧!

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

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

(0)
上一篇 2026年3月19日 上午9:59
下一篇 2026年3月19日 上午9:59


相关推荐

  • 网络攻防实验之缓冲区溢出攻击

    网络攻防实验之缓冲区溢出攻击这个实验是网络攻防课程实验中的一个,但是目前我还没有完全搞懂代码,以后有机会来补。也欢迎大佬指点一、实验目的和要求通过实验掌握缓冲区溢出的原理,通过使用缓冲区溢出攻击软件模拟入侵远程主机理解缓冲区溢出危害性,并理解防范和避免缓冲区溢出攻击的措施。二、实验原理和实验环境实验原理:缓冲区溢出(BufferOverflow)是目前非常普遍而且危…

    2022年7月12日
    31
  • intellij idea 2021激活码(最新序列号破解)

    intellij idea 2021激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    233
  • ws激活码【中文破解版】2022.01.30

    (ws激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月31日
    56
  • 【云原生|技术基石】4:速通云原生基石-Istio服务网格

    【云原生|技术基石】4:速通云原生基石-Istio服务网格现在本篇文章的学习可以学到 Istio 的基本原理 架构以及组成部件的作用 Istio 提供一种简单的方式来建立已部署的服务的网络 具备负载均衡 服务到服务认证 监控等等功能 而不需要改动任何服务代码 简单的说 有了 istio 你的服务就不再需要任何微服务开发框架 典型如 springcloud dubbo 也不再需要自己动手实现各种复杂的服务治理的功能 很多是 springcloud 和 dubbo 也不能提供的 需要自己动手 只要服务的客户端和服务器可以进行简单的直接网络访问 就可以通过将网络层委托给

    2026年3月19日
    2
  • Hasor Dataway使用教程

    Hasor Dataway使用教程绝了 这款工具让 SpringBoot 不再需要 Controller Service DAO Mapper 来自 开源中国 作者 哈库纳链接 https my oschina net ta8210 blog Dataway 介绍 Dataway 是基于 DataQL 服务聚合能力 为应用提供的一个接口配置工具 使得使用者无需开发任何代码就配置一个满足需求的接口 整个接口配置 测试 冒烟 发布 一站式都通过 Dataway 提供的 UI 界面完成 UI 会以 Jar 包方式提供

    2026年3月17日
    2
  • python实现压缩,解压文件,使用密码解压文件。

    python实现压缩,解压文件,使用密码解压文件。

    2021年9月18日
    63

发表回复

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

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