Flask 3.x 不支持 Python 3.12,因其依赖的 markupsafe 2.1.x、cffi、Werkzeug 2.3.x 等组件未适配 PEP 692 及新 ABI 规则,导致安装失败或运行时崩溃;推荐改用 FastAPI、Quart 或降级至 Flask 2.3.3。

Flask 3.x 不支持 Python 3.12 —— 官方明确声明最低要求是 Python 3.8,但截至 2024 年底,Flask 最新稳定版(3.0.3)仍**未通过 Python 3.12 的 CI 测试**,且其依赖的 Werkzeug、Jinja2 等核心组件在 3.12 上存在字节码兼容性与 C 扩展构建问题。强行安装可能触发 ImportError: cannot import name 'soft_unicode' from 'markupsafe' 或 ModuleNotFoundError: No module named '_cffi_backend' 类错误。
为什么 pip install flask==3.0.3 在 Python 3.12 下大概率失败
根本原因在于 Flask 3.0.x 依赖的 markupsafe(2.1.x 系列)和 cffi 尚未完全适配 Python 3.12 的 PEP 692(Keyword-Only Args in C APIs)及新的 ABI 标签规则。即使手动升级到 markupsafe>=2.3.0,Werkzeug 2.3.x 也会因内部使用的 inspect.Signature 行为变更而抛出 ValueError: too many keyword arguments。
-
pip install flask默认拉取的仍是 3.0.3,它不声明 Python 3.12 兼容性(python_requires仅写到>=3.8,但未做运行时校验) - Python 3.12 移除了
distutils,而部分旧版setuptools()在构建 <code>cffi扩展时会 fallback 到它,直接报错 - 即使绕过安装阶段(如用
--no-deps),Flask 启动时调用werkzeug.serving.make_server会因底层 socket 地址族解析逻辑变更而卡死或崩溃
当前可行的替代方案:降级 Python 或换框架
如果你必须用 Python 3.12,又需要类 Flask 的轻量 HTTP 框架,不要硬扛 Flask 3 —— 直接换更早支持 3.12 的替代品:
- 用
fastapi(0.110+):已全面支持 Python 3.12,异步友好,自带 OpenAPI;pip install "fastapi[standard]"即可开跑 - 用
quart(0.19+):API 兼容 Flask,但基于asyncio和Hypercorn,对 3.12 支持良好;注意路由装饰器是@app.route而非@app.get - 若坚持同步 + Flask 风格,可退到
Flask 2.3.3(最后一个 2.x 版),它在 Python 3.12 上经测试可运行(需同时锁定Werkzeug==2.3.7、Jinja2==3.1.3)
如果非要试 Flask 3 + Python 3.12:临时 workaround 步骤
这不是推荐路径,仅用于验证或 CI 调试。成功率低于 60%,且不保证生产稳定性:
立即学习“Python免费学习笔记(深入)”;
- 先升级构建工具:
pip install --upgrade setuptools==68.2.2 wheel - 强制指定兼容依赖:
pip install "markupsafe==2.3.3" "Werkzeug==3.0.2" "Jinja2==3.1.4" - 再装 Flask:
pip install --no-deps flask==3.0.3 && pip install --force-reinstall --no-deps werkzeug jinja2 markupsafe - 启动前加环境变量屏蔽潜在 ABI 冲突:
export PYTHONMALLOC=malloc(Linux/macOS) - 最小启动脚本必须禁用调试器:
app.run(debug=False, use_reloader=False),否则watchdog在 3.12 下会反复触发AttributeError: 'NoneType' object has no attribute 'fileno'
真正麻烦的不是装不上,而是某些中间件(比如 flask-sqlalchemy 3.0.x)或部署目标(如旧版 uWSGI)根本不识别 Python 3.12 的 pyd 扩展名,或者 Gunicorn 的 worker 启动时静默崩溃——这些不会报错,只会让请求一直 pending。


















