Django 中间件的执行顺序是什么?

2023-04-11 00:00:00 执行 中间件 顺序

Django 中间件的执行顺序是从上到下,即按照在 settings.py 文件中 MIDDLEWARE 列表中出现的顺序依次执行。

以下是一个简单的示例代码:

# settings.py 中的 MIDDLEWARE 配置
MIDDLEWARE = [
    'myapp.middleware.MyFirstMiddleware',
    'myapp.middleware.MySecondMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# myapp/middleware.py 中的中间件代码
class MyFirstMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print('MyFirstMiddleware before view')
        response = self.get_response(request)
        print('MyFirstMiddleware after view')
        return response

class MySecondMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print('MySecondMiddleware before view')
        response = self.get_response(request)
        print('MySecondMiddleware after view')
        return response

在这个示例中,我们定义了两个中间件类 MyFirstMiddlewareMySecondMiddleware,并将它们按照先后顺序加入到了 MIDDLEWARE 列表中。

当我们执行访问 pidancode.com/ 时,中间件的执行顺序如下:

  1. 执行 MyFirstMiddleware__call__ 方法,打印出 'MyFirstMiddleware before view',然后调用 get_response 得到视图函数的返回值。
  2. 执行 MySecondMiddleware__call__ 方法,打印出 'MySecondMiddleware before view',然后调用 get_response 得到视图函数的返回值。
  3. 执行视图函数并返回响应。
  4. 执行 MySecondMiddleware__call__ 方法,打印出 'MySecondMiddleware after view',然后返回响应对象。
  5. 执行 MyFirstMiddleware__call__ 方法,打印出 'MyFirstMiddleware after view',然后返回响应对象。

从中可以看出,Django 的中间件机制能够很方便地对请求和响应进行处理和修改,还可以通过控制中间件的顺序来灵活地进行调整和扩展。

相关文章