# 直接依赖。全部是「>= 下限」约束 —— 注意服务器跑在 **Python 3.9**, # pip 会自动退到「声明支持 3.9 的最高版本」:fastapi / uvicorn / python-multipart / pytest # 的最新版都已要求 >=3.10,所以服务器上装到的会比开发机旧一档(这是 pip 的正常行为,不是错误)。 fastapi>=0.110 # 代码里有 8 个文件直接 `from pydantic import BaseModel`。 # 它本来是 fastapi 的传递依赖(装了 fastapi 就会有),所以一直没写进来; # 2026-10-09 补上 —— 「直接 import 的就要直接声明」,否则 fastapi 哪天换掉它就会静默炸。 # 下限定 2.0:现有各环境实测都是 2.x,且 fastapi>=0.110 接受 <3。 pydantic>=2.0 uvicorn[standard]>=0.29 pymysql>=1.1 # ⚠️ Python 3.9 上 pytest / python-multipart 也会退版本,属正常。 # ⚠️ PyJWT:2026-10-09 全仓库扫描确认**没有任何地方 `import jwt`** —— # 鉴权走的是 `auth_sessions` 里的 64 位 hex token,`config.JWT_*` 只是历史命名。 # 但 `python-multipart` 不一样:虽然我们也不 import 它,FastAPI 处理 # `File(...)` / `Form(...)` 时**运行时需要它**,删了上传接口就 500,必须留着。 PyJWT>=2.8 httpx>=0.27 python-multipart>=0.0.9 pytest>=8.0 DBUtils>=3.0 # 2026-10-09 补记:`config.py` 一直在用 `from dotenv import load_dotenv`, # 但这份清单里从来没有它 —— 服务器上是手工装的,没有记录。 # 换机器 / 重建 venv 时就会 ImportError,所以必须写进来。 python-dotenv>=1.0 # 打卡附件 / 头像写 OSS(2026-09-22 新增)。 # 纯 Python 包,但 PyPI 上只有 sdist(没有 wheel)→ 会走源码安装,不需要编译器。 # 它依赖的 `crcmod` 是 C 扩展,好在 setup.py **编译失败时会退回纯 Python 实现**, # 所以没有编译器的机器也能装上(只是 CRC 校验慢一点)。 oss2>=2.17