一、中间件的执行过程
二、给中间件加三种方法对应的三种流程
三、自定义属于自己的中间件
四、中间件知识点总结
五、中间件的应用案例
---------------------------------------------------------------
一、中间件的执行过程
中间件:全局性的逻辑处理部分
介于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/") # 再判断是否登录,未登录的让其登录