Django 2.2 升级到 3.2 部署时中间件配置变化如何调整?

文章导读
升级过程中中间件配置项本身通常不需要修改,但需确保列表中的中间件类兼容新版 Django 及 Python 环境。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

升级过程中中间件配置项本身通常不需要修改,但需确保列表中的中间件类兼容新版 Django 及 Python 环境。

先说结论:Django 2.2 到 3.2 的中间件配置键名保持不变,主要风险在于第三方或自定义中间件代码是否移除了已废弃的 API。

  • 适合:现有项目从 LTS 版本平滑过渡到新版 LTS
  • 先准备:确认 Python 版本满足 3.6+ 并备份当前依赖列表
  • 验收:重点检查服务器日志是否有中间件初始化报错及请求响应状态

命令速用版

在调整配置前,先通过以下命令确认当前环境状态,避免盲目修改。

# 查看当前 Django 版本
python -m django `--version`

# 检查项目是否有已知的废弃用法警告
python manage.py check `--deploy`

# 升级依赖前记录当前版本
pip freeze > requirements_old.txt

为什么会这样

Django 2.2 属于长期支持版本,而 3.2 是后续的长期支持版本。两者之间跨越了 Django 3.0 这个大版本更新。在 3.0 版本中,官方彻底移除了对旧式中间件写法的支持,这意味着如果项目中存在自定义中间件仍沿用 2.0 之前的写法,升级后会直接启动失败。此外,Django 3.2 对 Python 版本有更高要求,底层依赖变化可能导致部分第三方中间件包无法加载。

分步处理

按照以下顺序调整,确保每一步都有回滚余地。

1. 备份配置与依赖

修改 settings.py 前复制一份备份,同时保留旧版 requirements 文件,以便升级失败后快速还原。

cp settings.py settings.py.bak
pip freeze > requirements_2.2.txt

2. 检查 Python 环境

Django 3.2 需要 Python 3.6 及以上版本。如果服务器 Python 版本过低,需先升级解释器,否则中间件即使配置正确也无法加载。

3. 审查自定义中间件(核心步骤)

打开 settings.py 中的 MIDDLEWARE 列表,逐一核对自定义类。Django 3.x 不再支持旧式的 process_request 写法,必须改为基于 __call__ 的新式写法。

Django 2.2 升级到 3.2 部署时中间件配置变化如何调整?

配置位置示例:

# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'myapp.middleware.CustomMiddleware',  # 重点检查此类
    'django.middleware.common.CommonMiddleware',
]

代码改造对比:

如果发现自己的中间件是以下旧式写法,必须重构:

# ❌ 旧式写法 (Django 2.2 及之前兼容,3.0+ 废弃)
class OldMiddleware:
    def process_request(self, request):
        # 处理逻辑
        pass

    def process_response(self, request, response):
        # 处理逻辑
        return response

请修改为以下新式写法,确保继承 MiddlewareMixin 或实现 __call__:

# ✅ 新式写法 (Django 3.2 推荐)
from django.utils.deprecation import MiddlewareMixin

class NewMiddleware(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response
        super().__init__()

    def __call__(self, request):
        # 请求前处理
        # response = self.get_response(request)
        # 响应后处理
        # return response
        return self.get_response(request)

4. 更新第三方包

部分第三方中间件包可能未适配 Django 3.x。在测试环境中先运行 pip install -U 包名,观察是否有报错。

怎么验证是否生效

配置调整完成后,不要直接全量上线,按以下步骤验证。

1. 启动服务观察日志

运行开发服务器或重启 WSGI/ASGI 进程,查看标准输出。如果中间件配置有误,通常会在启动阶段抛出 ImportError 或 MiddlewareNotUsed 异常。

python manage.py runserver

2. 触发请求测试

Django 2.2 升级到 3.2 部署时中间件配置变化如何调整?

访问一个需要中间件处理的页面(如需要登录验证或 CSRF 保护的页面)。如果返回 500 错误,查看日志堆栈,确认是否由中间件引起。

3. 检查响应头

使用 curl 或浏览器开发者工具查看响应头,确认安全类中间件(如 SecurityMiddleware)是否正常添加了预期的 Header。

常见坑

升级过程中以下几个细节容易忽略,建议提前排查。

1. 旧式配置项残留

有些老项目可能混用了 MIDDLEWARE_CLASSES 和 MIDDLEWARE,Django 3.x 不再支持前者,需确保 settings.py 中只保留 MIDDLEWARE 配置项。

2. 移除的工具函数

部分中间件代码可能调用了 django.utils.encoding.force_text 等函数,这些在 3.0 后被移除,需改为 force_str。

3. 异步支持问题

如果项目计划使用 ASGI 部署,需确认中间件是否支持异步调用。虽然 Django 3.2 兼容同步中间件,但混合使用可能影响性能或导致警告。