测试:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'folder.foo.MyFile', 'folder.foo.MyFile1', 'folder.foo.MyFile2', ] 在settings.py 中间件中添加在列表中新创一个文件夹folder,新建文件foo
from django.utils.deprecation import MiddlewareMixin class MyFile(MiddlewareMixin): def process_request(self,request): print('第一个process_request方法') class MyFile1(MiddlewareMixin): def process_request(self,request): print('第二个process_request方法') class MyFile2(MiddlewareMixin): def process_request(self,request): print('第三个process_request方法') foo在urls.py中添加相应路由
url(r'^index/', views.index) 路由在views.py
from django.shortcuts import render,HttpResponse def index(request): print('我是index的视图函数') return HttpResponse('index') views.py规律:
1.请求来的时候 会经过每个中间件里面的process_request方法(从上往下) 2.如果方法里面直接返回了HttpResponse对象 那么会直接返回 不再往下执行,会跳到同级别的process_response方法 基于该特点就可以做访问频率限制,身份校验,权限校验
补充:
在flask中间件中,他在走的时候,无论你在哪个中间件中返回HTTPResponse对象,都会掉头重新走process_response对象 在django中,是在同级别中走process_response对象
验证:
在第二个类中,返回HTTPResponse对象 class MyFile1(MiddlewareMixin): def process_request(self,request): print('第二个process_request方法') return HttpResponse('hahahhahhahhahhah') def process_response(self,request, response): print('第二个process_response方法') return response 验证结果:
第一个process_request方法 第二个process_request方法 第二个process_response方法 第一个process_response方法规律
1.必须将response形参返回 因为这个形参指代的就是要返回给前端的数据 2.响应走的时候 会依次经过每一个中间件里面的process_response方法(从下往上)
结果:
第一个process_request方法 第二个process_request方法 第三个process_request方法 <function index at 0x0000000003F5E268> () {} 第一个process_view方法 <function index at 0x0000000003F5E268> () {} 第二个process_view方法 <function index at 0x0000000003F5E268> () {} 第三个process_view方法 我是index的视图函数 第三个process_response方法 第二个process_response方法 第一个process_response方法 结果规律
1.在路由匹配成功执行视图函数之前 触发结果:
第一个process_request方法 第二个process_request方法 第三个process_request方法 <function index at 0x0000000003F5E268> () {} 第一个process_view方法 <function index at 0x0000000003F5E268> () {} 第二个process_view方法 <function index at 0x0000000003F5E268> () {} 第三个process_view方法 我是index的视图函数 第三个process_response方法 第二个process_response方法 第一个process_response方法 [25/Sep/2019 21:16:54] "GET /index/ HTTP/1.1" 200 5 结果不会触发
条件:
def index(request): print('我是index的视图函数') 123456321 return HttpResponse('index') 条件显示
第一个process_request方法 Traceback (most recent call last): 第二个process_request方法 第三个process_request方法 File "E:\lib\site-packages\django\core\handlers\exception.py", line 41, in inner <function index at 0x0000000003F5E268> response = get_response(request) () {} File "E:\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 第一个process_view方法 <function index at 0x0000000003F5E268> response = self.process_exception_by_middleware(e, request) () {} File "E:\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 第二个process_view方法 response = wrapped_callback(request, *callback_args, **callback_kwargs) <function index at 0x0000000003F5E268> () File "D:\untitled_django\day59\app01\views.py", line 6, in index {} serdtguyjiokpl 第三个process_view方法 我是index的视图函数 NameError: name 'serdtguyjiokpl' is not defined 第三个process_exception方法 第二个process_exception方法 第一个process_exception方法 [25/Sep/2019 21:45:35] "GET /index/ HTTP/1.1" 500 63493 第三个process_response方法 第二个process_response方法 第一个process_response方法 显示规律:
1.当你的视图函数报错时 就会自动执行
代码
from django.utils.deprecation import MiddlewareMixin class MyFile(MiddlewareMixin): def process_request(self,request): print('第一个process_request方法') def process_response(self,request,response): print('第一个process_response方法') return response def process_view(self,request,view_func,view_args,view_kwargs): print(view_func) print(view_args) print(view_kwargs) print('第一个process_view方法') def process_exception(self,request,exception): print('第一个process_exception方法') def process_template_response(self,request,response): print('第一个process_template_response方法') return response class MyFile1(MiddlewareMixin): def process_request(self,request): print('第二个process_request方法') def process_response(self,request, response): print('第二个process_response方法') return response def process_view(self, request, view_func, view_args, view_kwargs): print(view_func) print(view_args) print(view_kwargs) print('第二个process_view方法') def process_exception(self,request,exception): print('第二个process_exception方法') def process_template_response(self, request, response): print('第二个process_template_response方法') return response # class MyFile2(MiddlewareMixin): def process_request(self,request): print('第三个process_request方法') def process_response(self,request,response): print('第三个process_response方法') return response def process_view(self, request, view_func, view_args, view_kwargs): print(view_func) print(view_args) print(view_kwargs) print('第三个process_view方法') def process_exception(self,request,exception): print('第三个process_exception方法') def process_template_response(self, request, response): print('第三个process_template_response方法') return response 代码不会触发:
第一个process_request方法 第二个process_request方法 第三个process_request方法 <function index at 0x0000000003F5E268> () {} 第一个process_view方法 <function index at 0x0000000003F5E268> () {} 第二个process_view方法 <function index at 0x0000000003F5E268> () {} 第三个process_view方法 我是index的视图函数 第三个process_response方法 第二个process_response方法 第一个process_response方法 [25/Sep/2019 21:27:02] "GET /index/ HTTP/1.1" 200 5 显示条件:
def index(request): print('我是index视图函数') def render(): return HttpResponse('什么鬼玩意') obj = HttpResponse('index') obj.render = render return obj 条件规律:
1.当你返回的HttpResponse对象中必须包含render属性才会触发自定义中间件,研究这上面五个方法都有哪些特点
1.如果你想让你写的中间件生效 就必须要先继承MiddlewareMixin 2.在注册自定义中间件的时候 一定要确保路径不要写错 View Code
\
转载于:https://www.cnblogs.com/komorebi/p/11586216.html