a. 中间件是一个类
- process_request
- 有,直接执行当前中间件和上方中间件的process_response
- 无
应用: 用户登录授权(排除不需要登录的url)
实例:setting.py
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', 'md.middleware.M1', 'md.middleware.M2', ]
新增midle ware 文件夹
from django.shortcuts import HttpResponse,redirect
class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
class M1(MiddlewareMixin): def process_request(self,request): #request的时候进去 print('m1.process_request') def process_view(self,request, view_func, view_func_args, view_func_kwargs): #走完所有request再执行该函数 print('m1.process_view') def process_exception(self,request,exception):#有异常走该函数 print('m1.process_exception') def process_response(self,request,response):#返回reponse时执行该函数 print('m1.process_response') return response def process_template_response(self,request,response): #用render渲染时执行该函数 print('m1.process_template_response') return response class M2(MiddlewareMixin): def process_request(self, request): print('m2.process_request') def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('M2.process_view') def process_exception(self,request,exception): print('m2.process_exception') return HttpResponse('开发的程序员已经被打死') def process_response(self, request, response): print('m2.process_response') return response def process_template_response(self,request,response): print('m2.process_template_response') return response
流程:
- process_response
- 必须有返回值
- process_view
- process_exception
- process_tempalte_response
- 必须有返回值
- 必须对象中要有render方法
b. 流程
c. 什么时候用中间件?所有请求统一做处理时使用
- 登录验证
d. 中间件中的方法,可以有任意个