Python Django中间件详解:原理、方法与执行流程

栗子
栗子
发布时间:2026-10-16| 6人浏览过
原创

本文深入解析Django中间件的机制与用法。介绍如何创建自定义中间件类,详细阐述process_request、process_response、process_view、process_exception及process_template_response五个核心方法的参数与作用。结合代码示例,清晰展示中间件在请求生命周期中的执行顺序与条件触发逻辑,帮助开发者掌握全局请求处理技巧。

一、中间件简介

中间件是Django处理请求与响应过程中的钩子函数。作为一个轻量级且底层的“插件系统”,它允许全局性地修改Django的输入和输出。其本质是一个自定义类,其中定义了若干方法,Django框架会在特定的执行阶段自动调用这些方法,从而在视图函数执行前或执行后执行额外的操作。

每个中间件通常负责特定的功能。例如,内置的'django.contrib.auth.middleware.AuthenticationMiddleware'用于将用户身份与当前请求关联起来。

二、编写自己的中间件

中间件工厂是一个可调用的对象,它接收请求并返回响应。

中间件类可以定义以下五个方法:

  • process_request(self, request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self, request, response)
  • process_exception(self, request, exception)
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('来自M1 process_request')
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('来自M2 process_request')
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('来自M1 process_request')
    def process_response(self, request, response):
        print('来自M1 process_response')
        return response
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('来自M2 process_request')
    def process_response(self, request, response):
        print('来自M2 process_response')
        return response
  • process_request方法

该方法接收一个参数request,返回值可以是None或HttpResponse对象。若返回None,请求将继续向下传递至后续中间件或视图函数;若返回HttpResponse对象,则直接将该响应返回给浏览器,不再执行后续的视图函数。

在process_request方法的执行链中,视图函数是最后被调用的环节。

总结:

  • 中间件的process_request方法在视图函数执行之前运行。
  • 当配置了多个中间件时,系统会按照MIDDLEWARE列表中定义的索引顺序,从上至下依次执行各中间件的process_request方法。
  • 在不同中间件之间传递的request对象是同一个实例。
  • process_response方法

该方法在视图函数执行完毕后触发,其执行顺序与process_request相反,即从下至上依次执行。

定义process_response方法时,需传入request和response两个参数。其中response是视图函数返回的HttpResponse对象。如果该方法返回自定义的HttpResponse对象,浏览器接收到的将是这个自定义响应,而非后端默认处理的响应。

  • process_view方法

process_view(self, request, view_func, view_args, view_kwargs)

该方法包含四个参数:

request:即HttpRequest对象。

view_func:Django即将调用的视图函数对象(注意:这是实际的函数对象,而非函数名字符串)。

view_args:传递给视图函数的位置参数列表。

view_kwargs:传递给视图函数的关键字参数字典。需要注意的是,view_args和view_kwargs均不包含第一个参数(即request)。

Django在调用视图函数之前会调用此方法。若返回None,Django将继续处理请求,执行其他中间件的process_view方法,随后执行视图函数;若返回HttpResponse对象,则跳过视图函数,直接掉头执行process_response方法并将结果返回给浏览器。

process_view方法在Django路由系统解析之后、视图系统执行之前运行,其执行顺序严格遵循MIDDLEWARE配置中的注册顺序,从前到后依次执行。

  • process_exception方法

process_exception(self, request, exception)

该方法接收两个参数:

一个HttpRequest对象。

一个exception对象,即视图函数运行过程中产生的异常实例。

此方法仅在视图函数发生异常时执行。其返回值可以是None或HttpResponse对象。若返回HttpResponse对象,Django将调用模板渲染及中间件的process_response方法,并将结果返回给浏览器;若返回None,则将该异常交由下一个中间件的process_exception方法处理。其执行顺序同样遵循中间件注册顺序的倒序。

  • process_template_response方法

process_template_response(self, request, response)

该方法接收两个参数:一个HttpRequest对象,以及response(由视图函数或中间件生成的TemplateResponse对象)。

process_template_response在视图函数执行完成后立即触发,但有一个前提条件:视图函数返回的对象必须包含render()方法(即该对象是TemplateResponse对象或具有等价方法)。

三、中间件执行流程

当请求到达时,系统首先按照注册顺序依次执行所有中间件的process_request()方法。若某个process_request返回None,流程继续向下;若返回HttpResponse对象,则流程中断,转而执行当前层级及之后层级的process_response方法(从当前中间件开始向上回溯),最终将响应返回给浏览器。例如,若中间件3返回了HttpResponse对象,则执行中间件3的process_response,并依次向上执行后续中间件的process_response,而中间件1和2的process_request及process_response将不再执行。

当所有process_request方法执行完毕后,Django找到对应的视图函数。此时不立即执行视图函数,而是先执行中间件中的process_view方法。若process_view返回None,则继续依次执行所有中间件的process_view;待所有process_view执行完毕后,才执行视图函数。如图所示,若中间件3的process_view返回了HttpResponse对象,则跳过后续中间件的process_view及视图函数,直接执行最底部的process_response方法,并依次向上回溯执行各中间件的process_response,最终返回给浏览器。

process_template_response和process_exception两个方法的触发具有特定条件,且它们的执行顺序均为倒序。

至此,关于Python Django中间件的详细介绍已完成。如需了解更多Python Django相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。