day59 django生命周期 中间件 csrf跨站请求伪造auth模块 settings功能插拔式源码

mac2022-06-30  34

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()方法

测试:

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方法

2.process_response()

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()

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方法') 代码

结果:

第一个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()

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方法') 代码

结果:

第一个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.当你的视图函数报错时 就会自动执行

 

 

 5.process_template_response()

 代码

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

最新回复(0)