Django2.0——中间件
Django中间件middleware本质是一个类,在请求到返回的中间,类中不同的方法会在指定的时机中被触发。setting.py的变量MIDDLEWARE_CLASSES中的每一个元素都是中间件,且这些注册的中间件之间,有着严格的执行顺序。在request到url层之间,中间件的执行顺序是从上而下,依次执行。在response到浏览器之间,中间的执行顺序变成从下至上。
通常情况下,Django默认配置的中间件如下:
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',
]
中间件的执行顺序如下图所示:
写中间件类的定义五种方法如下,它们分别代表着各自不同的执行时机。
- process_request(self,request):执行视图前被调用,返回None或HttpResponse对象
- process_view(self,request,callback,callback_args,callback_kwargs):调用视图函数之前被执行,返回None或HttpResponse
上面两个方法是在请求到视图之间可以被执行的方法,若其中任意一个返回的HttpResponse,那么这个请求就不会到达视图层,而是直接返回给浏览器。
- process_template_response(self,request,response):视图函数渲染模板后立即被调用。
- process_exception(self,request,exception):在视图函数抛出异常时被调用,返回一个HttpResponse对象。
- process_response(self,request,response):所有响应返回到浏览器之前被调用,返回一个HttpResponse对象。
以上三个方法都是发生在response到客户端之间。
自定义中间件
自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。
自定义中间件的第一种方式:
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class Usermiddle(MiddlewareMixin):
def process_request(self,request):
print('这是方法1')
return None
def process_view(self,request,callback,callback_args,callback_kwargs):
print('这是方法2')
return None
def process_template_response(self,request,response):
print('渲染模板后执行')
return response
def process_exception(self,request,exception):
print('视图函数抛出异常')
return HttpResponse(exception)
def process_response(self,request,response):
print('这是方法5')
return response
自定义中间件的第二种方式:
class Usermiddle1(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self, request):
#从这开始是请求到视图前执行的语句
print('xxx')
#从这结束请求到视图前执行的语句
response = self.get_response(request)
# 从这开始是response到浏览器前执行的语句
print('xxx')
# 从这结束response到浏览器前执行的语句
return response
注册这两个类: