Django组件之中间件

阅读: 评论:0

Django组件之中间件

Django组件之中间件

中间件的概念

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变Django的输入以及输出.并且她改变的变量是全局的,所有需要谨慎使用,容易导致性能问题.

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的Middleware

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',&#ib.sessions.middleware.SessionMiddleware','django.middlewaremon.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware',&#ib.auth.middleware.AuthenticationMiddleware',&#ib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

每一个中间件都有一个具体的功能.

中间件一共是有四个办法:

process_request process_viewprocess_exceptionprocess_response

 

 

当用户发起请求的时候秒回依次经过所有的中间件,这个时候的请求由process_request到达views函数中,views处理后,再依次穿过中间件,这个时候是process_response,最后再返回给请求者.

上图的中间件都是Django中默认就有的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是必须继承MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin

in views:

def index(request):print("view函数...")return HttpResponse("OK")

in Mymiddlewares.py:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")def process_response(self,request,response):print("Md1返回")return responseclass Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")
#return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")return response

结果:

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

注意:如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下:

返回Md2中断的页面,后台打印如下:

Md1请求
Md2请求
Md2返回
Md1返回

流程图如下:

process_view

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

 Mymiddlewares.py修改如下

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")#return HttpResponse("Md1中断")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md1view")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md2view")

结果如下:

Md1请求
Md2请求
Md1view
Md2view
view函数...
Md2返回
Md1返回

下图进行分析上面的过程:

当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。

process_view可以用来调用视图函数:

class Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")#return HttpResponse("Md1中断")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):# return HttpResponse("hello")response=callback(request,*callback_args,**callback_kwargs)return response

结果如下:

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。

process_exception

1 process_exception( self , request, exception)

示例修改如下:

class Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")#return HttpResponse("Md1中断")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):# return HttpResponse("hello")# response=callback(request,*callback_args,**callback_kwargs)# return responseprint("md1 ")def process_exception(self):print("md1 ")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")# return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("md2 ")def process_exception(self):print("md1 ")

结果如下:

Md1请求
Md2请求
md1 
md2 
view函数...Md2返回
Md1返回

流程图如下:

当views出现错误时:

 

 将md2的process_exception修改如下:

  def process_exception(self,request,exception):print("md2 ")return HttpResponse("error")

结果如下:

Md1请求
Md2请求
md1 
md2 
view函数...
md2 
Md2返回
Md1返回

应用案例

1、做IP访问频率限制

某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。

2、URL访问过滤

如果用户访问的是login视图(放过)

如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!

 

转载于:.html

本文发布于:2024-01-29 15:27:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170651327816244.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:组件   中间件   Django
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23