Django中间件
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件,如下图。
django中间件就是一个类,在全局范围内处理django的输入和输出。
与manage.py在同一目录下的文件夹 项目/middleware下的auth.py文件中的Authentication类
中间件中可以定义五个方法,分别是
-
process_request(self,request)
-
process_view(self, request, view_func, view_args, view_kwargs)
-
process_template_response(self,request,response)
-
process_exception(self, request, exception)
-
process_response(self, request, response)
创建中间件类
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class MD1(MiddlewareMixin): def process_request(self, request): # print(id(request)) print('MD1 process_request') # return HttpResponse('md1') def process_response(self, request, response): # print(id(response)) print('MD1 process_response') return response def process_view(self, request, view_func, view_args, view_kwargs): # print(view_func, type(view_func)) # print(view_args, type(view_args)) # print(view_kwargs, type(view_kwargs)) print('MD1 process_view') # return HttpResponse('md1') def process_exception(self, request, exception): print('MD1 process_exception') # print(exception) def process_template_response(self, request, response): print('MD1 process_template_response') response.context_data = {'index': '真的别想了!!'} return response class MD2(MiddlewareMixin): def process_request(self, request): print('MD2 process_request') def process_response(self, request, response): print('MD2 process_response') return response def process_view(self, request, view_func, view_args, view_kwargs): # print(view_func, type(view_func)) # print(view_args, type(view_args)) # print(view_kwargs, type(view_kwargs)) print('MD2 process_view') def process_exception(self, request, exception): print('MD2 process_exception') # print(exception) return HttpResponse('已经处理完了') def process_template_response(self, request, response): print('MD2 process_template_response') response.context_data = {'index': '别想了'} return response
注册中间件
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', 'app01.middleware.my_middleware.MD1', 'app01.middleware.my_middleware.MD2', ]
process_request(self,request)
执行时间: 在视图函数之前
参数:request request对象,跟视图函数中的是同一个
执行顺序:按照注册的顺序顺序执行
返回值:
None:正常流程
HttpResponse对象:不执行下一个中间中的process_request方法,也不执行视图函数,直接执行当前中间件中的process_response方法
process_response(self, request, response)
执行时间: 在视图函数之后
参数:
request request对象,跟视图函数中的是同一个
response: HttpResponse对象
执行顺序:按照注册的顺序倒叙执行
返回值:
HttpResponse对象:正常流程
process_view(self, request, view_func, view_args, view_kwargs)
执行时间: 在process_request之后,在视图函数之前
参数:
request request对象,跟视图函数中的是同一个
view_func: 要执行的视图函数
view_args: 视图函数的位置参数
view_kwargs: 视图函数的关键字参数
执行顺序:按照注册的顺序顺序执行
返回值:
None:正常流程
HttpResponse对象:下一个中间件中的process_view方法不执行,视图函数不执行,执行所有中间件的process_response方法
process_exception(self, request, exception)
执行时间: 有异常才触发执行 在视图函数之后
参数:
request request对象,跟视图函数中的是同一个
exception 错误对象
执行顺序:按照注册的顺序倒叙执行
返回值:
None:正常流程,错误交给django处理
HttpResponse对象:下一个中间件中的process_exception方法不执行,,执行所有中间件的process_response方法
process_template_response(self,request,response)
执行时间: 视图返回的是TemplateResponse对象才执行,或者对象有一个render的方法
参数:
request request对象,跟视图函数中的是同一个
response 响应对象
执行顺序:按照注册的顺序倒叙执行
返回值:
HttpResponse对象:正常流程