Django的中间件

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.GZipMiddlewareGzip 压缩响应


文章标签:

评论(0)