侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Django中间件的执行流程与自定义中间件

2025-12-14 / 0 评论 / 3 阅读

题目

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):
        # 在调用视图前执行
        pass

3. 注册中间件

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:会话消息支持