Django-middleware, djangomiddleware
1. Request cycle of Django Middleware
We send a Request from the browser and get a response content HttpResponse. The process of passing this Request to Django is as follows:
That is to say, each request first goes through the process_request function in the middleware. This function returns the None or HttpResponse object. If the former is returned, it continues to process other middleware. If an HttpResponse is returned, the process is aborted, return to the webpage.
Ii. Customize and register middleware 1. Create Middleware
Create a middleware py file under the project root directory:
1 class RequestExeute (object): 2 def process_request (self, request): 3 print ('process _ request') 4 5 def process_view (self, request, callback, callback_args, callback_kwargs): 6 print ('process _ view') 7 8 def process_exception (self, request, exception): 9 "" 10 when the views function fails, execute 11: param request: 12: param exception: 13: return: 14 "15 print ('process _ exception') 16 17 def process_response (self, request, response ): 18 "19 must return HttpResponse20: param request: 21: param response: 22: return: 23" 24 print ('process _ response ') 25 return response26 27 def process_template_response (self, request, response): 28 "29 in the return value of the view function, if there is a render method, it is called 30: param request: 31: param response: 32: return: 33 "34 print ('process _ template_response ') 35 return responseMd. py2. register Middleware
In the settings. py file, register as follows:
Ps. In Versions 1.9 and earlier, the middleware keyword is: MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES = ('zqxt. middleware. BlockedIpMiddleware ',... other middleware)Iii. execution sequence of methods in middleware 1. normal status
1 from django. shortcuts import HttpResponse 2 from django. utils. deprecation import MiddlewareMixin 3 class M1 (MiddlewareMixin): 4 def process_request (self, request): 5 print ('m1. request ') 6 # return HttpResponse ('request _ m1') 7 8 def process_view (self, request, callback, callback_args, callback_kwargs): 9 print ('m1. view ') 10 # response = callback (request, * callback_args, ** callback_kwargs) 11 # return response12 13 def process_response (self, request, response): 14 print ('m1. response ') 15 return response16 17 def process_exception (self, request, exception): 18 print ('m1. process_exception ') 19 return HttpResponse ('m1. process_exception ') 20 21 def process_template_response (self, request, response): 22 "" 23 "in the return value of the view function, if there is a render method, it is called 24: param request: 25: param response: 26: return: 27 "28 print ('m1. process_template_response ') 29 return response30 31 32 class M2 (MiddlewareMixin): 33 def process_request (self, request): 34 print ('m2. request ') 35 36 def process_view (self, request, callback, callback_args, callback_kwargs): 37 print ('m2. view ') 38 # response = callback (request, * callback_args, ** callback_kwargs) 39 # return response40 41 def process_response (self, request, response): 42 print ('m2. response ') 43 return response44 45 def process_exception (self, request, exception): 46 print ('m2. process_exception ') 47 return HttpResponse ('m2. process_exception ') 48 49 def process_template_response (self, request, response): 50 "" 51 "in the return value of the view function, if there is a render method, 52: param request: 53: param response: 54: return: 55 "" 56 print ('m2. process_template_response ') 57 return responseProcess_request and process_view return None
Execution sequence:
2. Versions 1.10 and later
If process_request returns the HttpResponse object, it is returned from the process_response of the current middleware.
1 from django. shortcuts import HttpResponse 2 from django. utils. deprecation import MiddlewareMixin 3 class M1 (MiddlewareMixin): 4 def process_request (self, request): 5 print ('m1. request ') 6 return HttpResponse ('request _ m1') 7 8 def process_view (self, request, callback, callback_args, callback_kwargs): 9 print ('m1. view ') 10 # response = callback (request, * callback_args, ** callback_kwargs) 11 # return response12 13 def process_response (self, request, response): 14 print ('m1. response ') 15 return response16 17 def process_exception (self, request, exception): 18 print ('m1. process_exception ') 19 return HttpResponse ('m1. process_exception ') 20 21 def process_template_response (self, request, response): 22 "" 23 "in the return value of the view function, if there is a render method, it is called 24: param request: 25: param response: 26: return: 27 "28 print ('m1. process_template_response ') 29 return response30 31 32 class M2 (MiddlewareMixin): 33 def process_request (self, request): 34 print ('m2. request ') 35 36 def process_view (self, request, callback, callback_args, callback_kwargs): 37 print ('m2. view ') 38 # response = callback (request, * callback_args, ** callback_kwargs) 39 # return response40 41 def process_response (self, request, response): 42 print ('m2. response ') 43 return response44 45 def process_exception (self, request, exception): 46 print ('m2. process_exception ') 47 return HttpResponse ('m2. process_exception ') 48 49 def process_template_response (self, request, response): 50 "" 51 "in the return value of the view function, if there is a render method, 52: param request: 53: param response: 54: return: 55 "" 56 print ('m2. process_template_response ') 57 return response58 59 60 # class RequestExeute (object): 61 # def process_request (self, request): 62 # print ('process _ request ') 63 #64 # def process_view (self, request, callback, callback_args, callback_kwargs): 65 # print ('process _ view') 66 #67 # def process_exception (self, request, exception): 68 # "" 69 # execute 70 #: param request: 71 #: param exception: 72 #: return: 73 #"74 # print ('process _ exception') 75 #76 # def process_response (self, request, response ): 77 #"78 # must return HttpResponse79 #: param request: 80 #: param response: 81 #: return: 82 # "" 83 # print ('process _ response') 84 # return response85 #86 # def process_template_response (self, request, response ): 87 # "" 88 # in the returned value of the view function, if the render method exists, 89 #: param request: 90 #: param response: 91 #: return: 92 #"93 # print ('process _ template_response ') 94 # return responseProcess_request of M1 returns HttpResponse
Execution sequence:
Process_view is similar to process_request:
1 from django. shortcuts import HttpResponse 2 from django. utils. deprecation import MiddlewareMixin 3 class M1 (MiddlewareMixin): 4 def process_request (self, request): 5 print ('m1. request ') 6 # return HttpResponse ('request _ m1') 7 8 def process_view (self, request, callback, callback_args, callback_kwargs): 9 print ('m1. view ') 10 response = callback (request, * callback_args, ** callback_kwargs) 11 return response12 13 def process_response (self, request, response): 14 print ('m1. response ') 15 return response16 17 def process_exception (self, request, exception): 18 print ('m1. process_exception ') 19 return HttpResponse ('m1. process_exception ') 20 21 def process_template_response (self, request, response): 22 "" 23 "in the return value of the view function, if there is a render method, it is called 24: param request: 25: param response: 26: return: 27 "28 print ('m1. process_template_response ') 29 return response30 31 32 class M2 (MiddlewareMixin): 33 def process_request (self, request): 34 print ('m2. request ') 35 36 def process_view (self, request, callback, callback_args, callback_kwargs): 37 print ('m2. view ') 38 # response = callback (request, * callback_args, ** callback_kwargs) 39 # return response40 41 def process_response (self, request, response): 42 print ('m2. response ') 43 return response44 45 def process_exception (self, request, exception): 46 print ('m2. process_exception ') 47 return HttpResponse ('m2. process_exception ') 48 49 def process_template_response (self, request, response): 50 "" 51 "in the return value of the view function, if there is a render method, 52: param request: 53: param response: 54: return: 55 "" 56 print ('m2. process_template_response ') 57 return responseProcess_view of m1 returns HttpResponse
Execution sequence:
3. Versions earlier than 1.10
If process_request returns the HttpResponse object, the process_request after the current middleware will not be executed, but will be returned from the process_response of the last middleware.
References:
1. Path to Python [Article 16th]: Django [Basics]
2. http://code.ziqiangxuetang.com/django/django-middleware.html