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对象:正常流程