Python Django中间件原理、流程与实战详解

今天早睡
今天早睡
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Django中间件的运行机制与核心流程,详细阐述process_request、process_view等五大关键方法的触发时机与作用。通过具体代码示例,演示如何继承MiddlewareMixin实现IP限制、URL过滤及缓存等常见场景,并对比中间件与装饰器的适用边界,帮助开发者高效构建全局请求处理逻辑。

Django中间件概述

一、什么是Django中间件

Django 中间件是框架层面用于处理请求(request)和响应(response)的钩子机制。作为一个轻量级的插件系统,它允许在全局范围内修改 Django 的输入与输出。每个中间件组件通常负责执行特定的功能任务。

通俗来说,中间件允许开发者在视图函数执行前后插入额外的操作逻辑。它本质上是一个自定义类,其中定义了若干方法,Django 框架会在请求处理的不同阶段自动调用这些方法。

中间件定义规则与核心方法

二、Django中间件的定义规则

1、 自定义中间件的规则

(1)必须继承 MiddlewareMixin 类

from django.utils.deprecation import MiddlewareMixin

(2)需要重写父类提供的方法

父类提供了五个主要方法,其中最核心的是 process_request 和 process_response。

(1)process_request(self, request)

*主要方法。在请求进入并执行视图函数之前调用。(通常无return)

1.中间件的 process_request 方法会在视图函数执行前运行。

2.当配置多个中间件时,它们会按照 MIDDLEWARE 列表中的注册顺序(即索引值),从前到后依次执行。

3.在不同中间件之间传递的 request 对象是同一个实例。

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

*在 URL 路由匹配成功、但执行视图函数之前调用。此时可以获取视图函数对象及其所有参数。(通常无return)


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

request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
'''

(3)process_template_response(self, request, response)

*较少使用。在视图函数调用 render() 渲染方法后调用。(有return)

(4)process_exception(self, request, exception)

当视图函数执行过程中抛出异常时调用。(通常无return)

*该方法接收两个参数:

一个是 HttpResponse 对象

另一个是视图函数产生的 exception 异常对象

此函数仅在视图函数抛出异常时才会执行。它返回 None 或 HttpResponse 对象。如果返回 HttpResponse 对象,Django 将调用模板及中间件中的 process_response 方法,并将结果返回给浏览器;否则默认处理异常。若返回 None,则交由下一个中间件的 process_exception 方法处理,其执行顺序遵循中间件注册顺序的倒序。

(5)process_response(self, request, response)

主要方法。在视图函数执行完毕并生成响应后调用。(有return)

返回值可以是 None 或 HttpResponse 对象。如果返回 None,则继续按照 Django 定义的流程向下执行,交由下一个中间件处理;如果返回 HttpResponse 对象,Django 将不再执行视图函数,而是直接将该对象返回给用户。

(3)将自定义中间件类添加到 settings.py 文件中的 MIDDLEWARE 配置项里

settings.py


MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  
  # 自定义 在对应app内创建一个 my_middleware.py文件,然后定义类名为Middleware的中间件
  'app.my_middleware.Middleware',
]

# 白名单路径,不需要做登陆就能访问的页面
WHITE_LIST = ['/login/', '/logout/']

MIDDLEWARE 是一个列表,其中的元素是字符串形式的类路径,代表具体的中间件。

代码实现示例

三、代码实现

my_middleware.py


from django.utils.deprecation import MiddlewareMixin # 导入中间间模块
from django.shortcuts import redirect # 返回页面模块
from middlewareDemo import settings # 导入白名单


class Middleware(MiddlewareMixin): # 认证中间件

  def process_request(self, request):
    """
    请求来之前判断是否已经登录
    :param request:
    :return:
    """
    white_list = settings.WHITE_LIST

    if request.path in white_list:
      return None # 如果是白名单的路径,直接跳过
    if not request.user.is_authenticated: # 获取用户是否登陆
      return redirect('/login/')
  
  def process_response(self, request, response):
    """
    不管是何执行结果,都会返回相应的HttpResonse对象
    :param request:
    :param response:
    :return:
    """
    print('m1.process_response')
    return response

  def process_exception(self, request, exception):
    """
    出现异常才会被调用进行异常处理
    :param request:
    :param exception:
    :return:
    """
    print('m1.process_exception')

常见应用场景

四、中间件的使用场景

1.做IP限制

将特定 IP 放在中间件列表中,以阻止某些 IP 访问。

2.URL访问过滤

例如,如果用户访问的是 logo 视图(通常设为放行)。

若访问其他视图,需检测是否已有 session。若存在则放行,否则返回 login 页面。这样可以避免在多个视图函数上重复编写装饰器。

3.缓存

当客户端请求到达时,中间件先检查缓存中是否有数据。若有,直接返回给用户;若无,再交由逻辑层执行视图函数。

4、CSRF

Django 项目默认启用 CSRF 保护,每次请求时通过 CSRF 中间件检查请求中是否包含正确的 token 值。

中间件与装饰器的区别

五、Django中间件与装饰器的区别

1、Django 中间件:在视图函数执行前进行预处理,并在执行后进行收尾工作。它不区分具体视图,对所有视图一视同仁,统一执行前置处理或后置处理。

Django 创建时默认内置了 6 个中间件(如 session 和 csrf)。在视图函数执行前进行的处理,既可以使用装饰器,也可以使用中间件。

2、装饰器:主要区别在于作用域。如果在视图函数上添加装饰器,它能保证该视图方法在执行前后被执行,但仅适用于添加了装饰器的特定视图。

若需进行不区分视图的普遍处理,应使用 middleware 以避免编写重复代码。中间件本质上是一个自定义类,其中定义了几个方法,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 算法库。