解析
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,
django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,
其中每一个元素就是一个中间件,
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',
]
以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,
如果是HttpResonse对象,则直接将该对象返回给用户。
流程图
上面的流程图可能有些乱,为了解流程花的草图;
上面是Django 1.9版本的流程图,到django 1.10就变了;
变成了request在相对应的response中找。
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.shortcuts import HttpResponse class test1Middleware(object): def process_request(self, request): print('11111111') def process_view(self, request, callback, callback_args, callback_kwargs): print('process_view1') def process_response(self, request, response): print('response 111111') return response def process_template_response(self, request, response): print('template1') return response def process_exception(self, request, exception): print('ex1') class test2Middleware(object): def process_request(self, request): #if request.META['REMOTE_ADDR'] in ['1.1.1.1','1.1.1.2']: # return HttpResponse('SB') # return HttpResponse('SB') print('22222') def process_view(self, request, callback, callback_args, callback_kwargs): print('process_view2') def process_template_response(self, request, response): print('template2') return response def process_exception(self, request, exception): print('ex2') class test3Middleware(object): def process_request(self, request): print('33333') def process_response(self, request, response): print('response 33333') return response def process_view(self, request, callback, callback_args, callback_kwargs): print('process_view3') def process_template_response(self, request, response): print('template3') return response def process_exception(self, request, exception): print('ex3') return HttpResponse('500')