Django的中间件
已于 2025年05月16日 13:12 修改
访问次数:0
Django 中间件(Middleware)是 Django 请求处理过程中的一种轻量级插件机制,它能在 请求和响应处理过程的多个阶段注入自定义逻辑。常用于身份认证、权限校验、日志记录、异常处理、性能分析等场景。
✅ 一、中间件的作用
Django 的请求-响应周期中,中间件在以下几个阶段发挥作用:
浏览器 -> 请求 -> 中间件处理 -> 视图 -> 响应 -> 中间件处理 -> 浏览器
中间件可以:
- 在请求到达视图前进行处理(如身份验证)
- 在视图执行后返回响应前进行处理(如数据加密、缓存)
- 处理异常(如统一错误返回)
- 处理视图函数执行前后的逻辑(如性能统计)
✅ 二、中间件的编写
一个中间件本质上是一个 Python 类,实现以下方法中的一个或多个:
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# 此处可做一次性初始化操作
def __call__(self, request):
# 视图函数调用前执行
response = self.process_request(request)
# 如果 process_request 返回响应,短路处理
if response:
return response
# 调用视图函数
response = self.get_response(request)
# 视图函数调用后执行
response = self.process_response(request, response)
return response
def process_request(self, request):
"""请求刚进入时调用(可省略)"""
return None # 或返回一个 HttpResponse 对象
def process_response(self, request, response):
"""视图函数处理完后调用"""
return response
def process_exception(self, request, exception):
"""视图函数抛出异常时调用"""
return None # 或返回一个 HttpResponse
def process_view(self, request, view_func, view_args, view_kwargs):
"""在调用视图函数之前调用(可用于权限校验)"""
return None
✅ 三、中间件使用步骤
1. 编写中间件类
# myapp/middleware.py
from django.http import HttpResponse
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print("Request start") # 视图前
response = self.get_response(request)
print("Request end") # 视图后
return response
def process_exception(self, request, exception):
return HttpResponse("Custom error occurred!")
2. 注册中间件
在 settings.py 中添加到 MIDDLEWARE 列表(按顺序执行):
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ...
'myapp.middleware.SimpleMiddleware',
]
✅ 四、中间件调用顺序(生命周期)
中间件的调用顺序和返回顺序如下:
| 阶段 | 执行顺序 |
|---|---|
process_request | 从上往下执行 |
process_view | 从上往下执行 |
| 视图函数执行 | 中间件外 |
process_exception | 从下往上执行(如果有异常) |
process_response | 从下往上执行 |
✅ 五、中间件示例
示例1:请求头鉴权
class TokenAuthMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
token = request.headers.get('X-Auth-Token')
if token != 'secret-token':
return HttpResponse("Unauthorized", status=401)
return self.get_response(request)
示例2:统一异常处理
class ExceptionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
return self.get_response(request)
except Exception as e:
return HttpResponse(f"Error occurred: {str(e)}", status=500)
✅ 六、注意事项
- 中间件执行顺序与定义顺序有关,上面的先执行,下面的后执行(对请求);反之亦然(对响应)
- 避免在中间件中执行耗时操作(除非必要),可放入异步任务
- 中间件之间应保持独立,减少耦合
- Django 3.0 及之后不再支持旧式中间件接口(基于 process_* 方式构建),推荐使用新式 __call__ 结构
✅ 七、中间件调试建议
- 使用 print() 或 logging 打印日志追踪调用顺序
- 使用 time.time() 或 time.perf_counter() 记录性能瓶颈
- 可以自定义配置,动态启用/禁用某些中间件(通过 settings.py)
✅ 八、扩展:第三方中间件示例
| 中间件名称 | 作用 |
|---|---|
django-cors-headers | 跨域请求支持(CORS) |
django-debug-toolbar | 页面调试工具 |
django.middleware.cache.UpdateCacheMiddleware | 缓存更新 |
django.middleware.gzip.GZipMiddleware | Gzip 压缩响应 |
评论(0)