题目
Django中间件的执行流程与自定义中间件
信息
- 类型:问答
- 难度:⭐⭐
考点
Django中间件原理,自定义中间件,请求响应流程
快速回答
Django中间件是处理请求/响应的轻量级插件系统,执行流程分为请求阶段和响应阶段:
- 请求阶段:按
MIDDLEWARE顺序从上到下执行 - 视图处理:到达视图函数
- 响应阶段:按
MIDDLEWARE逆序从下到上执行
自定义中间件需实现以下方法:
__init__(self, get_response)初始化__call__(self, request)处理请求/响应- 可选方法:
process_view,process_exception,process_template_response
1. 中间件执行原理
Django中间件是处理请求/响应过程的钩子框架,执行顺序如下:
Request → Middleware1 (request) → Middleware2 (request) → View → Middleware2 (response) → Middleware1 (response) → Response关键特性:
- 双向处理:请求自上而下,响应自下而上
- 短路机制:中间件返回
HttpResponse会跳过后续处理 - 分层设计:每层只关注特定功能(如认证、CSRF、缓存)
2. 自定义中间件实现
示例:记录请求处理时间的中间件
# middleware.py
import time
class TimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 请求处理前
start_time = time.time()
# 调用下一个中间件/视图
response = self.get_response(request)
# 响应处理后
duration = time.time() - start_time
print(f"请求 {request.path} 耗时 {duration:.2f}秒")
return response
# 可选钩子方法
def process_view(self, request, view_func, view_args, view_kwargs):
# 在调用视图前执行
pass3. 注册中间件
在settings.py中添加:
MIDDLEWARE = [
# ...
'myapp.middleware.TimingMiddleware',
]4. 最佳实践
- 保持轻量:避免在中间件中执行耗时操作
- 错误处理:使用
process_exception处理视图异常 - 顺序敏感:
- 安全中间件(如
SecurityMiddleware)应靠前 - 响应处理中间件(如
GZipMiddleware)应靠后
- 安全中间件(如
5. 常见错误
- 循环导入:避免在中间件顶部导入模型(改用局部导入)
- 顺序错误:如将
SessionMiddleware放在AuthenticationMiddleware之后 - 未返回响应:
__call__中必须返回HttpResponse对象
6. 扩展知识
- 类中间件 vs 函数中间件:Django 1.10+ 推荐类形式
- 异步支持:Django 3.1+ 支持
async def __call__() - 内置中间件:
CommonMiddleware:URL规范化/ETag处理CsrfViewMiddleware:CSRF保护MessageMiddleware:会话消息支持