中间件
- 概念:
- Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。
- 中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
- 使用场景:当某些操作在每次请求或响应时都会执行时,可以写在中间件中
- 比如,每次发送post请求都要进行CSRF验证,就把CSRF验证的代码写在中间件中
- 设计思想:面向切面编程 / 无侵害式编程
- 不用直接修改框架源码,就可以达到自己想要的执行结果
中间件方法
Django在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预。
1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
def __init__(): pass
2.处理请求前:在每个请求上调用,返回None或HttpResponse对象
def process_request(request): pass
3.处理视图前:在每个请求上调用,返回None或HttpResponse对象
def process_view(request, view_func, view_args, view_kwargs): pass
4.处理模板响应前:在每个请求上调用,返回实现了render方法的响应对象
def process_template_response(request, response): pass
5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
def process_response(request, response): pass
6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
def process_exception(request,exception): pass
自定义中间件
- 中间件是一个独立的
python类
,可以定义这六个方法中的一个或多个 - 在应用中新建
middleware.py
文件 在
middleware.py
文件中定义类TestMiddleware
class TestMiddleware(object): def __init__(self): print('--------------init') def process_request(self, request): print('--------------request') def process_view(self, request, view_func, view_args, view_kwargs): print('--------------view') def process_template_response(self, request, response): print('--------------template') return response def process_response(self, request, response): print('--------------response') return response
配置自定义中间件
应用.文件名.类名
==Book.middleware.TestMiddleware
MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'Book.middleware.TestMiddleware',# 增加自定义中间件 )
浏览调用过程
提示
如果多个中间件中注册了相同的方法,则先注册的后执行