django中间件可以定义5种方法:
在执行视图前被调用
- process_request(self,request)
- process_view(self, request, callback, callback_args, callback_kwargs)
(1)执行完所有中间件的request方法‘
(2)url匹配成功
(3)拿到 视图函数的名称、参数,(注意不执行) 再执行process_view()方法
(4)最后去执行视图函数
- process_template_response(self,request,response)
#如果视图函数中的返回值 中有render方法,才会执行 process_template_response
既然process_template_respnse,不返回视图函数的return的结果,而是返回视图函数 return值(对象)的render方法;(多加了一个环节),就可以在 这个视图函数返回对象的 render方法里,做返回值的二次加工了!多加工几个,视图函数就可以随便使用了!(好比 喷雾器有了多个喷头,换不同的喷头喷出不同水,返回值就可以也组件化了)
- process_exception(self, request, exception)
1、执行完所有 request 方法
2、执行 所有 process_view方法
3、如果视图函数出错,执行process_exception(最终response,process_exception的return值)
如果process_exception 方法有了 返回值 就不再执行 其他中间件的 process_exception,直接执行response方法响应
4.执行所有response方法
5.最后返回process_exception的返回值(如果返回HttpResponse('出错了兄弟!!!'),则前不会报错,只会重新返回指定信息或者指定渲染页面)
- process_response(self, request, response)
怎么为django项目添加一个中间件呢:
1)、创建一个文件夹(最好放在工程根目录下)middleware
2)、创建一个python文件(例如m.py)
3)、伪装成系统的中间件,继承自MiddlewareMixin(from django.utils.deprecation import MiddlewareMixin)
4)、创建继承 MiddlewareMixin的类,重写以上五种方法中需要的方法
5)、注册中间件(在settings中进行配置,在 MIDDLEWARE中添加:middleware.文件名.类名)
如:
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('M1.request')
# callback视图函数名称 callback_args,callback_kwargs 视图函数执行所需的参数
def process_view(self, request,callback,callback_args,callback_kwargs ):
print("M1.process_view")
response=callback(request,*callback_args,**callback_kwargs)
return response
def process_response(self, request, response):
print('M1.response')
return response
settings.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',
'middleware.m.MD1', # 自定义中间件MD1
]