详细介绍看:https://www.cnblogs.com/liwenzhou/p/8761803.html
1:创建一个.py文件。如:my_middle.py
2:在创建的py文件里面写自定义的中间件。如:M1,M2
3::在setting.py里的MIDDLEWARE里加上自定的中间件。如:‘my_middle.M1’,‘my_middle.M2’,
创建M1,M2两个中间件。
在settings里注册顺序:
‘my_middle.M1‘,
‘my_middle.M2‘,
1 from django.utils.deprecation import MiddlewareMixin 2 3 class M1(MiddlewareMixin): 4 def process_request(self,request): 5 print(‘m1的process_request‘) 6 def process_response(self,request,response): 7 print(‘m1的process_response‘) 8 return response 9 def process_view(self,request,callback,callback_arg,callback_kwargs): 10 print(callback) 11 print(‘m1的process_view‘) 12 class M2(MiddlewareMixin): 13 def process_request(self,request): 14 print(‘m2的process_request‘) 15 def process_response(self,request,response): 16 print(‘m2的process_response‘) 17 return response 18 def process_view(self,request,callback,callback_arg,callback_kwargs): 19 print(callback) 20 print(‘m2的process_view‘)
运行结果:
m1的process_request
m2的process_request
<function middle_test at 0x0000000003F86620>
m1的process_view
<function middle_test at 0x0000000003F86620>
m2的process_view
视图函数
m2的process_response
m1的process_response
其过程如图所示:
process_request的返回值有两个:None和HttpResponse。如果返回值是None则按原来的顺序进行执行,入如果是HttpResponse则不会执行后面的中间件中的process_request,和process_view。直接从该中间件的process_response执行。并将返回值返回给用户。
process_response只能返回HttpResponse对象,这里返回的是response。
process_view有4个参数
request:请求相关的内容。
callback:是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
callback_args是将传递给视图的位置参数的列表.
callback_kwargs是将传递给视图的关键字参数的字典。 callback_args和callback_kwargs都不包含第一个视图参数(request)。
ps:后面三个参数callback这个名字是可以改变的。
process_view有2个返回值None和HttpResponse。当返回值是None时,按原来的顺序执行不做改变。入如果是HttpResponse,则不会执行后面的中间件的process_view,直接执行process_response(不是从当前中间件的process_response执行,是从第一个执行)。
process_exception(self,request,exception):是在执行试图函数之后process_response之前执行。在视图函数没有异常时不执行。视图函数有异常时才执行。执行的顺序是按照注册的顺序的倒序执行。有2个返回值None和HttpResponse。当返回值是None时,按原来的顺序执行不做改变。入如果是HttpResponse,如:
return HttpResponse(str(exception)),不会执行下面的process_exception,直接执行process_response。并将返回值返回给浏览器。
原文:https://www.cnblogs.com/gwwj/p/11368986.html