概念
中间件是django进行请求/响应处理的钩子框架。它是一个轻量级,低级的‘插件’系统,用于全局改变django的输入和输出。
每一个中间件负责做一些特定的功能。
说白了中间件就是可以使我们在执行视图函数之前或者之后都可以进行一些额外的操作。它的本质就一个自定义类,其中定义了几种方法,django框架会在特定的时间去执行这些方法。
由于其是影响全局的,所以要谨慎使用,使用不当会影响性能.
在django的setting.py中,有一个MIDDLEWARE_CLASS变量,其中的每一个元素就是一个中间件:
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', ]
上述列表中的每一个字符串其实就是一个中间件。
自定义中间件
中间件中可以定义5个方法,他们是:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
前两个方法是从前往后执行的,后3个方法是从后往前执行的.
自定义中间件(函数):
def simple_middleware(get_response):
# One-time configuration and initialization.
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
return middleware
自定义中间件(类):
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
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', 'SimpleMiddleware', ]
将自定义的中间件加入到MIDDLEWARE列表中。
中间件的执行流程
process_request:
1 process_request的执行是在执行视图函数之前执行的.
2 当遇到多个中间件时,会按照中间件的注册顺序,从前到后执行.
3 不同中间件传递的request都是同一个对象.
process_reponse:
1 process_reponse的执行是在执行视图函数之后执行的。
2 当遇到多个中间件时,会按照注册的顺序,从后先前执行。
3 不同的中间键传递到request都是同一个对象.
你可以把中间件想象成一个洋葱,每个中间键类都是一个层,它覆盖了洋葱的核心,如果请求通过了洋葱的所有层,已将请求传递到下一层,一直到内核的视图,
那么响应会在返回的过程中通过每个层.