django生命周期
django中间件
django中间件是类似于是django的保安
请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models)
响应走的时候也需要经过中间件才能到达web服务网关接口
django默认的七个中间件
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', ]
django中间件中有五个用户可以自定义的方法
掌握 1.process_request()方法 2.process_response()方法 了解 3.process_view() 4.process_exception() 5.process_template_response()
django中间件可以用来做什么
1.网站全局的身份校验,访问频率限制,权限校验...只要是涉及到全局的校验你都可以在中间件中完成
2.django的中间件是所有web框架中 做的最好的
1.process_request()方法
测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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', ]
在列表中新创一个文件夹folder,新建文件foo
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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方法')
在urls.py中添加相应路由
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
url(r'^index/', views.index)
在views.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.shortcuts import render,HttpResponse def index(request): print('我是index的视图函数') return HttpResponse('index')
规律:
1.请求来的时候 会经过每个中间件里面的process_request方法(从上往下) 2.如果方法里面直接返回了HttpResponse对象 那么会直接返回 不再往下执行,会跳到同级别的process_response方法 基于该特点就可以做访问频率限制,身份校验,权限校验
补充:
在flask中间件中,他在走的时候,无论你在哪个中间件中返回HTTPResponse对象,都会掉头重新走process_response对象
在django中,是在同级别中走process_response对象
验证:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
在第二个类中,返回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方法
2.process_response()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 class MyFile1(MiddlewareMixin): def process_request(self,request): print('第二个process_request方法') def process_response(self,request, response): print('第二个process_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
规律
1.必须将response形参返回 因为这个形参指代的就是要返回给前端的数据
2.响应走的时候 会依次经过每一个中间件里面的process_response方法(从下往上)
3.process_view()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse 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方法') 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 def process_view(self, request, view_func, view_args, view_kwargs): print(view_func) print(view_args) print(view_kwargs) print('第二个process_view方法') 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方法')
结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一个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.在路由匹配成功执行视图函数之前 触发
4.process_exception()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse 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方法') 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方法') 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方法')
结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一个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
不会触发
条件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def index(request): print('我是index的视图函数') 123456321 return HttpResponse('index')
显示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一个process_request方法 Traceback (most recent call last): 第二个process_request方法 第三个process_request方法 File "E:libsite-packagesdjangocorehandlersexception.py", line 41, in inner <function index at 0x0000000003F5E268> response = get_response(request) () {} File "E:libsite-packagesdjangocorehandlersase.py", line 187, in _get_response 第一个process_view方法 <function index at 0x0000000003F5E268> response = self.process_exception_by_middleware(e, request) () {} File "E:libsite-packagesdjangocorehandlersase.py", line 185, in _get_response 第二个process_view方法 response = wrapped_callback(request, *callback_args, **callback_kwargs) <function index at 0x0000000003F5E268> () File "D:untitled_djangoday59app01views.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.当你的视图函数报错时 就会自动执行
5.process_template_response()
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
不会触发:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一个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
条件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def index(request): print('我是index视图函数') def render(): return HttpResponse('什么鬼玩意') obj = HttpResponse('index') obj.render = render return obj
规律:
1.当你返回的HttpResponse对象中必须包含render属性才会触发
自定义中间件,研究这上面五个方法都有哪些特点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.如果你想让你写的中间件生效 就必须要先继承MiddlewareMixin 2.在注册自定义中间件的时候 一定要确保路径不要写错