中间介(MiddleWare)
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/9823498.html
目录
引子-Django的生命周期
自定义中间介
1、自定义中间介
2、setttings文件配置
3、视图函数
4、urls.py文件
5、访问URL
MiddlewareMixin函数
源码
总结
中间介整体执行流程
中间介应用场景
最常用的方法
引子-Django的生命周期
在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。
加上中间介的流程如下:
在Django中的setttings文件有配置middleware
1 2 3 4 5 6 7 8 9 | 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' , ] |
执行顺序从上到下。
自定义中间介
1、自定义中间介
新建一个名为middle的包,下面新建文件md.py,
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request( self ,request): print "MD1 process_request" def process_response( self ,request,response): print "MD1 process_response" return response class MD2(MiddlewareMixin): def process_request( self ,request): print "MD2 process_request" def process_response( self ,request,response): print "MD2 process_response" print response return response |
2、setttings文件配置
MIDDLEWARE新增中间介配置:
1 2 3 4 5 6 7 8 9 10 11 | 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' , 'middle.md1.MD1' , 'middle.md1.MD2' , ] |
3、视图函数
views.py
1 2 3 | def md(request): print "views function" return HttpResponse( 'execute view function' ) |
4、urls.py文件
1 2 3 4 5 6 7 8 9 | urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^index/' , views.index), url(r '^mf/' , views.mf), url(r '^fm/' , views.fm), url(r '^myform/' , views.myform), url(r 'md' ,views.md), ] |
5、访问URL
浏览器返回视图函数的内容:
后台执行:
中间介依次执行,
MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response
中间介的response值为视图函数的返回值。
1 2 3 4 5 6 7 8 | class MD1(MiddlewareMixin): def process_request( self ,request): print "MD1 process_request" #process_request函数有返回值时,会直接返回给用户,而不往下执行。 return HttpResponse( 'MD1 process_request' ) def process_response( self ,request,response): print "MD1 process_response" return response |
执行结果为:
多个middleware的整体执行流程如下:
MiddlewareMixin函数
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MiddlewareMixin( object ): #构造函数执行父类的构造函数 def __init__( self , get_response = None ): self .get_response = get_response super (MiddlewareMixin, self ).__init__() def __call__( self , request): response = None #如果当前中间介有process_request方法,则执行 if hasattr ( self , 'process_request' ): response = self .process_request(request) #如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去 if not response: response = self .get_response(request) #执行当前中间介的process_reponse方法 if hasattr ( self , 'process_response' ): response = self .process_response(request, response) return response |
7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。
每个中间介,可能只有process_request,也可能只有process_response方法。
总结
中间介整体执行流程
中间介应用场景
对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。
csrf是通过判断request的header里面是否有csrf参数。
最常用的方法
process_request
因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2017-10-20 python的super函数学习