目录

  1. Django 中间件简介
  2. Django 中间件的工作原理
  3. 自定义中间件
  4. 中间件链
  5. 常见的中间件类
  6. 参考资料

1. Django 中间件简介

在 Django 中,中间件是一个轻量级的、底层的插件系统,它可以处理请求和响应的生命周期。中间件的主要目的是在请求处理过程中拦截和修改请求或响应。Django 中的每个请求都会依次通过中间件进行处理,从而能够实现各种功能,如认证、缓存、会话管理、安全等。

  • 请求处理:中间件可以拦截请求并进行一些处理后传递给视图。
  • 响应处理:视图处理请求后,生成的响应也可以通过中间件进行修改或附加操作。

Django 的中间件是按顺序应用的,每个中间件类都可以对请求和响应进行处理。


2. Django 中间件的工作原理

Django 中间件的工作原理可以分为两个主要阶段:

  1. 请求阶段:当一个 HTTP 请求到达 Django 时,它会依次通过在 MIDDLEWARE 配置中的中间件类进行处理。中间件会接收请求对象 request,并对其进行处理,然后将其传递给视图函数。
  2. 响应阶段:视图处理完成后,返回一个响应对象 response,它会通过中间件链反向传递给客户端。在这一过程中,中间件类可以修改响应内容或做其他操作。

请求处理顺序

  1. 请求从浏览器到达服务器。
  2. 请求依次通过 MIDDLEWARE 中配置的中间件处理。
  3. 最后由视图函数处理请求并返回响应。

响应处理顺序

  1. 视图返回响应。
  2. 响应依次通过 MIDDLEWARE 中的中间件进行处理。
  3. 最终响应返回给客户端。

3. 自定义中间件

3.1 编写简单中间件

Django 中间件通常是一个类,该类实现了 __init____call__ 方法。Django 1.10 及以后版本支持基于类的中间件结构,而早期版本使用基于函数的中间件。

以下是一个基于类的中间件示例:

# 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("Before processing request")

        # 调用下一个中间件或者视图处理请求
        response = self.get_response(request)

        # 响应处理后
        print("After processing response")
        return response

  • __init__(self, get_response):构造函数接收一个 get_response 参数,它代表了下一个中间件或视图的处理函数。
  • __call__(self, request):每次请求都会调用这个方法,在这里可以处理请求和响应。

3.2 中间件处理请求和响应

可以在 __call__ 方法中访问和修改请求(request)或响应(response)。例如:

# myapp/middleware.py
class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在请求阶段,修改请求
        request.custom_attribute = "Hello, Middleware!"

        # 调用下一个中间件或视图
        response = self.get_response(request)

        # 在响应阶段,修改响应
        response['X-Custom-Header'] = 'Custom Value'
        return response

在这个例子中,request.custom_attribute 在请求处理前被添加,然后在视图中可以访问该属性。同时,在响应中增加了一个自定义 HTTP 头 X-Custom-Header


4. 中间件链

Django 中的中间件是按照在 MIDDLEWARE 配置中的顺序应用的。每个中间件都可以修改请求或响应,最终形成一个中间件链。

  • 请求链:请求会按照 MIDDLEWARE 中配置的顺序进入每个中间件。
  • 响应链:响应会逆向经过中间件链。

例如:

# settings.py
MIDDLEWARE = [
    'myapp.middleware.MiddlewareOne',
    'myapp.middleware.MiddlewareTwo',
    'django.middleware.common.CommonMiddleware',
]

在请求进入视图之前,它将先经过 MiddlewareOne,然后是 MiddlewareTwo,最后是 Django 的 CommonMiddleware。响应将按相反的顺序处理。


5. 常见的中间件类

Django 提供了许多内置中间件类来处理常见任务。以下是一些常见的中间件类:

  • django.middleware.security.SecurityMiddleware:提供跨站点请求伪造(CSRF)、HTTP Strict Transport Security(HSTS)等安全功能。
  • django.contrib.sessions.middleware.SessionMiddleware:管理用户会话。
  • django.contrib.auth.middleware.AuthenticationMiddleware:实现用户认证系统,关联当前用户。
  • django.middleware.common.CommonMiddleware:提供一些常用的功能,如重定向和 URL 规范化。
  • django.middleware.csrf.CsrfViewMiddleware:处理 CSRF 攻击防护。
  • django.middleware.gzip.GZipMiddleware:提供 HTTP 响应的压缩功能。
  • django.middleware.locale.LocaleMiddleware:处理国际化(i18n)相关的中间件。

这些中间件可以通过 MIDDLEWARE 配置启用和配置。


6. 参考资料

出站链接

站内链接