Django进阶–中间件
1. 简介
中间件是Dajngo框架对request/response
响应的轻量级插件系统。作用于用户和视图函数之间。
2. 使用
2.1 创建模块
在app下创建一个自定义中间件模块`
-project #项目名
-project
-book #app名
-Middleware.py # 起名随意
2.2 编写
def simple_middleware(get_response): #可以编写函数中间件
# 仅在项目启动时运行一次
print('函数中间件项目启动运行')
def middleware(request):
# 对于每个request请求,调用视图函数之前运行
print('函数中间件视图函数被调用前运行')
response = get_response(request) #调用视图函数
# 对于每个request请求,调用视图函数之后运行
print('函数中间件视图函数被调用后运行')
return response
return middleware
class SimpleMiddleware: #也可以编写类中间件
def __init__(self, get_response):
self.get_response = get_response
# 仅在项目启动时运行一次
print('类中间件项目启动运行')
def __call__(self, request):
# 对于每个request请求,调用视图函数之前运行
print('类中间件视图函数被调用前运行')
response = self.get_response(request)
# 对于每个request请求,调用视图函数之后运行
print('类中间件视图函数被调用后运行')
return response
2.3 注册
在settings.py
中注册
MIDDLEWARE = [
'book.middleware.SimpleMiddleware',
'book.middleware.simple_middleware',
]
注意:此处我们先注册了类中间件
2.4 验证
启动项目,发送请求
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
函数中间件项目启动运行
类中间件项目启动运行
#发送一次请求后
类中间件视图函数被调用前运行
函数中间件视图函数被调用前运行
#执行一次请求后
视图函数被调用
函数中间件视图函数被调用后运行
类中间件视图函数被调用后运行
[01/Apr/2019 10:51:30] "GET /book/students/ HTTP/1.1" 200 9167
2.5 流程
基于注册先后顺序(若函数中间件先注册,调用顺序相反)
- 启动时的调用顺序:栈式结构,先注册者后调用
- 请求时的调用顺序:洋葱模型、先注册者先调用、访问到洋葱核心(视图函数)再原路返回。
对于第2条详解,将每一个注册的中间件想象为洋葱的一层,先注册的在外层。请求到来时,从最外层,层层深入直到视图函数;然后再原路返回,直到最外层。
3. 补充
参考文献:官方文档
心蓝没有墨染帅气,不过比墨染有菜花?