django 之 中间件
在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,一个正常的请求会穿过所有的中间件最后到达view函数,最后又穿过中间件返回给用户
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',
]
中间件的作用:适用于对所有的请求作处理,如黑名单过滤 或 公共校验等
示例:自定义中间件
模仿其他的中间件(from django.middleware.csrf import CsrfViewMiddleware)
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Row1(MiddlewareMixin): def process_request(self,request): print('row1-1') def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('row1-2') def process_response(self, request, response): print('row1-3') return response class Row2(MiddlewareMixin): def process_request(self,request): print('row2-1') # return HttpResponse('xxx') 如果此处返回,则不再往下走,结果:'row1-1'=>'row2-1'=>'row2-3'=>'row1-3' def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('row2-2') def process_response(self, request, response): print('row2-3') return response class Row3(MiddlewareMixin): def process_request(self,request): print('row3-1') def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('row3-2') def process_response(self, request, response): print('row3-3') return response
执行顺序:
1、先执行所有的 process_request()函数: 打印'row1-1'=>'row2-1'=>'row3-1'
2、匹配urls路由规则,读取到view函数中的参数,依次执行 process_view()函数:打印'row1-2'=>'row2-2'=>'row3-2'
3、执行view.py 函数,并将结果返回:打印'row3-3'=>'row3-2'=>'row3-1'
自定义中间件除了以上3个常用方法,还可以定义以下两个:
process_exception(self, request, exception)
process_template_response(self,request,response)
class Row4(MiddlewareMixin): def process_request(self,request): print('row4-1') def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('row4-2') def process_response(self, request, response): print('row4-3') return response def process_exception(self, request, exception): # 如果view.py 中出现异常时才执行 if isinstance(exception,ValueError): return HttpResponse('出现异常') def process_template_response(self,request,response): # 如果Views中的函数返回的对象中,具有render方法, 如下view.py print('xxx') return response
# view.py
class Foo:
def render(self):
return HttpResponse('OK')
def test(request):
print('xxx')
return Foo()
注册中间件:自定义完中间件,在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', 'Middle.m1.Row1', 'Middle.m1.Row2', 'Middle.m1.Row3', ]

浙公网安备 33010602011771号