Django的中间件
- 中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
中间件的定义方法
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。中间件工厂函数需要接收一个可以调用的get_response
对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request
对象参数,返回一个response
对象。
其实中间件就是flask中的请求钩子
- 在users应用中新建一个
middleware.py
文件
def my_middleware(get_response):
print('init 被调用')
def middleware(request):
print('before request 被调用')
response = get_response(request)
print('after response 被调用')
return response
return middleware
定义好中间件后,需要在settings.py
文件中添加注册中间件,这才是最关键最关键的一步,如果不进行注册,他就是一个普通的闭包函数,只有进行了注册,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',
'users.middleware.my_middleware', # 新添加注册中间件
]
多个中间件的执行顺序
在请求视图被处理前,中间件由上至下依次执行
在请求视图被处理后,中间件由下至上依次执行
值得注意的是,中间件和扩展类的作用很类似:
中间件
不区分应用和路由,只要有请求就会进行相应的操作,作用在全局扩展类
只能在该子应用中使用,并且只有被装饰的视图起作用