Django中间件我觉得是一个非常重要的东西,所以把自己的一些理解分享出来,哪里有不对的还希望大家可以帮助我修改。
因为是自己写的代码,所以就把代码粘过来了,里边每一部分都会有自己的理解和注释,见谅!
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect,HttpResponse #对于有些Django没有MiddleMixin类,就在上边自己写一个,但是这时上边的类引用就不要再引了 # class MiddlewareMixin(object): # def __init__(self, get_response=None): # self.get_response = get_response # super(MiddlewareMixin, self).__init__() # # def __call__(self, request): # response = None # if hasattr(self, 'process_request'): # response = self.process_request(request) # if not response: # response = self.get_response(request) # if hasattr(self, 'process_response'): # response = self.process_response(request, response) # return response #有的Django版本不支持上边的MiddleMixin类,这时你需要自己在上边写一个MiddleMixin类 #定义完自己的中间件加到SETTINGS文件里就可以用了。 class M1(MiddlewareMixin): def process_request(self,request): # if request.path_info=='login': # return None # elif request.session.get('user'): # return redirect('login') print('M1_process_request',request) def process_response(self,request,response): print('M1_request_response') return response #关于中间件的process_view函数,其实就是帮助路由匹配系统匹配视图函数的中间件,所以在执行完process_request函数以后,会执行 #这里的process_view来匹配视图函数,匹配到以后再去执行视图函数的函数体(注意这里的匹配到并不是匹配到就结束,而是全部都要匹 # 配一遍),所以process_view的执行结果会在视图函数之前,之后再去执行exception函数(如果匹配到异常的话,注意这里的异常只捕 #捉一次),最后再去执行process_response函数 #对于在process_view函数中直接返回结果的情况,这时不再执行接下来的process_view函数,也不再执行视图函数,而是直接从最底端 # 开始执行倒序的process_response函数,这时可以说process_view函数替代了原来的视图函数。 def process_view(self, request, callback, callback_args, callback_kwargs): print('M1.process_view') def process_exception(self,request,response): print('M1.process_exception') return HttpResponse('Internal_Error(M1),This is PROCESS_EXCEPTION_HANDLING_FUNCTION') class M2(MiddlewareMixin): def process_request(self,request): print('M2_process_request') def process_response(self,request,response): print('M2_process_response') return response def process_view(self, request, callback, callback_args, callback_kwargs): print('M2.process_view') def process_exception(self,request,response): print('M2.process_exception') return HttpResponse('Internal_Error(M2),This is PROCESS_EXCEPTION_HANDLING_FUNCTION') #中间件流程总结: #①.在没有process_view或者process_exception时,浏览器的访问请求通过与Django独立的wsgi模块建立socket链接,在这之后通过Django #设置的中间件(本身是类,并且可以调用类下定义的方法),顺序是按照配置文件里的中间件中的列表顺序执行中间件的process_request部分, #遇到不是return None的process_request就会中断,然后从当前终止的位置倒序执行process_response #②.如果中间件定义了process_view,这时就会顺序执行process_request,执行结束,再从头开始执行process_view以及request_response #的中间件方法. #具体显示效果如下: # M1_process_request <WSGIRequest: GET '/favicon.ico'> # M2_process_request # Not Found: /favicon.ico # [18/Sep/2017 18:32:58] "GET /favicon.ico HTTP/1.1" 404 2061 # M2_process_response # M1_request_response # [18/Sep/2017 18:32:59] "GET / HTTP/1.1" 200 62 # M1_process_request <WSGIRequest: GET '/'> # M2_process_request # M1.process_view # M2.process_view # This is Index View_Function # M2.process_exception # M2_process_response # M1_request_response #③对于process_response,一定要有返回值,不然访问页面时,后端会报错。 #同时,中间件的process_request处理完请求,视图函数也处理完请求返回值时,倒序通过process_response的return返回值,期间我们 #可以通过process_response处理视图函数返回的值,从而达到修改视图函数返回结果的效果。