Django中的中间件
中间件(相当于java中的拦截器)
- Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
- 中间件类似于java中的拦截器。实现在浏览器发送请求后到视图接收到请求之前,以及视图返回响应后到浏览器接收到响应之前进行一些操作
- 中间件实际上就是一个装饰器。可以理解为是一个作用在视图上的装饰器
1 中间件使用方法
1.定义中间件
def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware
实例:
在book子应用中创建文件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
2.在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', 'book.middleware.my_middleware', # 添加中间件 ]
3.定义视图并测试:
def test_view(request): print('test_view视图代码执行') return HttpResponse(f"index, param:{request.body}")
访问这个视图结果:
before request 被调用
test_view视图代码执行
after response 被调用
说明:
- 就是装饰器的执行原理
- 中间件中初始化代码在项目启动时执行一次(装饰器初始化代码在模块加载时执行一次)
2.多个中间件的调用顺序
2.1 定义两个中间件,并在settings.py中配置:
中间件:
def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request my_middleware111111被调用') response = get_response(request) print('after response my_middleware111111被调用') return response return middleware def my_middleware2(get_response): print('init 被调用') def middleware(request): print('before request my_middleware22222被调用') response = get_response(request) print('after response my_middleware22222被调用') return response return middleware
配置:
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', 'book.mw.my_middleware', # 中间件1 'book.mw.my_middleware2', # 中间件2 ]
2.2 发送请求,执行结果:
before request my_middleware111111被调用
before request my_middleware22222被调用
test_view视图代码执行
after response my_middleware22222被调用
after response my_middleware111111被调用
说明:中间件1相当于在中间2外面再套一层,其实就是视图上加了多个装饰器