中间件
什么是Django的中间件
完整django请求的生命周期
如果有中间件其中的请求不通过会这样:
所以说中间件其实是在路由系统前就会发生的,在django中是一个类,用其中的process_request函数处理;如果views中函数处理完了以后,则也是要经过中间件来处理,通过相关类中的procee_response处理;其实也可以用process_view对视图函数处理,process_exception对view中函数出现异常处理,process_template_response是在视图中返回的对象中含有render方法才执行。
作用:例如可以对于所有的客户请求,在到达路由系统前,作一些验证的工作。也可以作一些视图函数处理后的后期工作。其实就是对请求的事前事后的统一处理。
关于process_view
process_exception
视图函数中有异常才处理。
process_template_response
执行条件:就是views中返回的对象中含有render方法,才执行。
自定义中间件
步骤一、创建文件夹
步骤二、写中间件的类
(1)、导入:from django.utils.deprecation import MiddlewareMixin
或者在django.utils.deprecation中把MiddlewareMixin整个类复制过来
(2)、写类,需继承MiddlewareMixin,但注意写以下方法:process_request和process_response、process_view、process_exception、process_template_response
# from django.utils.deprecation import MiddlewareMixin class MiddlewareMixin: # 推荐这种方式 def __init__(self, get_response=None): self.get_response = get_response super().__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) response = response or self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class M1(MiddlewareMixin): def process_request(self, request, *args, **kwargs): print('m1.process_request') def process_response(self, request, response): print('m1.process_response') return response # 注意process_response必须有返回值的 class M2(MiddlewareMixin): def process_request(self, request, *args, **kwargs): print('m2.process_request') def process_response(self, request, response): print('m2.process_response') return response
在中间件中实现登陆验证的功能
class Auth(MiddlewareMixin): def process_request(self, request, *args, **kwargs): if request.path_info == '/login/': return None # 请求处理也可以return,return None则到下一个中间件,返回其他则交给同一个中间件的process_response处理 if not request.session.get(settings.USER_SESSION_KEY): # 没有建立会话 return redirect('/login/')