Django--中间件

一、中间件的执行过程

二、给中间件加三种方法对应的三种流程

三、自定义属于自己的中间件

四、中间件知识点总结

五、中间件的应用案例

---------------------------------------------------------------

一、中间件的执行过程

中间件:全局性的逻辑处理部分
介于request和response之间的处理程序
settings.py里的MIDDLEWARE就是中间件,有七个,有先后顺序

请求先到wsgiref被封装成request,
再到中间件,共七个
按顺序执行每个中间件的process_request()方法
从中间件出去后到了路由层,路由分发给相应的视图函数
处理完后
顺序执行中间件的process_response()方法
然后到了wsgiref,封装响应,交给浏览器

中间件调用流程: 

二、给中间件加三种方法对应的三种流程

情况一:

process_request里写return HttpResponse(..) 请求被拦截。见下图所示

情况二:

中间件里写了process_view(self, request,callback, callback_args, callback_kwargs)方法:

情况三:

三、自定义属于自己的中间件

在app01里新建my_middlewares.py
加到settings.py里的MIDDLEWARE
"app01.my_middlewares.CustomerMiddleware"

from django.utils.deprecation import MiddlewareMixin
class CustomerMiddleware(MiddlewareMixin):
  def process_request(self,request):
    print('request.....')
    #return HttpResponse("forbitton")   如果写这个就会拦截浏览器请求
  def process_response(self, request, response):
    print('response...')
    return response    #不响应要报错
    # 执行完中间件会依次执行各个中间件的process_view方法
    # callback是路由对应的视图函数,callback_args是视图函数的参数
  def process_view(self, request,callback, callback_args, callback_kwargs):
    # 下面这相当于执行对应的视图函数,得到响应再返回,就拦截了
    # response = callback(callback_args,callback_kwargs) 
    # return response
    print('process_view....')
  # 不出错不会执行这个,出错会依次执行中间件的这个方法,直到有中间件返回响应
  def process_exception(self,request,exception):
    print('process_exception...')
    return HttpResponse(exception)

四、中间件知识点总结

掌握:
1、process_request(self, request):中间件访问时执行的方法
2、process_response(self, request, response):中间件响应的时候执行的方法
3、执行流程
了解:
process_view
process_exception

五、中间件的应用案例

针对大多数视图要做的事情可以放在中间件里去做
例如校验是否登录,登录就执行视图函数。
例如限制一分钟内只能访问服务器20次,否则就屏蔽

中间件的应用案例:

1、做IP访问频率限制
某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次
2、URL访问过滤
如果用户访问的是login视图(放过)
如果访问其他视图,要检测是否有session认证,已经有了就放行,没有就返回login,
这样就省得在多个视图函数上写装饰器了

先在settings.py里定义白名单:WHITE_LIST['login/','reg/','logout/']
class AuthMiddleware(MiddlewareMixin):
  def process_request(self,request):
    white_list = settings.WHITE_LIST
    if request.path in white_list:
      return None       # 先判断路径是不是白名单的。如果路径在白名单里,就结束这个方法,即放行
    if not request.user.is_authenticated:
      return redirect("/login/")    # 再判断是否登录,未登录的让其登录

原文地址:https://www.cnblogs.com/staff/p/10739732.html