mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-14 05:00:10 +00:00
错误码(t16)
- HTTP 语义只由 core/exceptions.py 的 RET.code → fastapi.status 映射决定;
映射表显式登记 -1→400 与全部「数值即 HTTP 状态」的 RET 成员,_DEFAULT_BUSINESS_STATUS
降为「新增码忘登记」的安全网
- 移除冗余 status_code:131 处调用点改为纯 code 表达;security.py/dependencies.py
的 status_code=401/403 去除(映射表已给);get_or_404 → code=RET.NOT_FOUND.code
- 新增静态护栏(AST):app/ 下除 exceptions.py 外不得出现 status_code 传参,
路由装饰器 201 白名单显式放行并断言白名单非空
异常写法统一(t19)
- 删除 CustomException.internal 及 132 处包装:意外异常直接冒泡,由全局
@app.exception_handler(Exception) 统一映射 5xx + 通用文案 + 日志;
需要运维上下文处改为 logger.exception("<业务动作>失败") + raise
- 构造器不再接受 status_code 参数(属性保留,由 code 派生)→ 结构上杜绝第二来源
- 修复 6 处「宽泛 except 把 400 包成 500」的语义反转(补 except CustomException: raise),
并加 AST 护栏防止回潮
- 全局 SQLAlchemyError:非完整性错误由 400 改为 503(连接类)/500(其它),
不再把驱动原文/异常类型拼进客户端 msg;顺带修掉不存在的
status.HTTP_403_SERVICE_UNAVAILABLE 常量(命中即 AttributeError→500)
验证:pytest 97 passed / ruff 全绿;AST 审计残留 0;护栏红绿测试通过;
线上实测验证码过期仍 400 并保留业务文案、无令牌 401。
FastApiAdmin - Backend
基于 FastAPI 框架构建的企业级后端架构,为前端 Vue3 管理系统提供完整的 API 服务支持。
与仓库根文档的关系:项目总览、一键前后端启动、演示账号、Docker 部署、架构图与默认端口等请以 根目录 README.md 为准;本文档侧重
backend/目录结构、迁移命令与后端开发约定。
技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| FastAPI | 0.138.2 | 现代 Web 框架 |
| SQLAlchemy | 2.0.51 | ORM 框架 |
| Alembic | 1.18.4 | 数据库迁移工具 |
| Pydantic | 2.12.5+ | 数据验证与序列化 |
| APScheduler | 3.11.0 | 定时任务调度 |
| redis-py | 7.1.0 | 缓存与会话存储 |
| Uvicorn | 0.49.0 | ASGI 服务器 |
| Python | 3.12+ | 运行环境 |
项目结构
backend/
├── app/ # 项目核心代码
│ ├── alembic/ # 数据库迁移管理
│ ├── api/ # 路由装配层(routers.py 按域分组聚合各模块路由)
│ ├── modules/ # 业务模块层(按业务域竖切)
│ │ ├── system/ # 系统管理
│ │ ├── monitor/ # 系统监控
│ │ ├── task/ # 定时任务(cronjob)+ 存储传输(storage)
│ │ ├── generator/ # 代码生成
│ │ ├── ai/ # AI 功能
│ │ └── common/ # 文件上传 / 公共能力
│ ├── common/ # 公共组件(常量、枚举、响应封装)
│ ├── config/ # 项目配置文件
│ ├── core/ # 核心模块(数据库、中间件、安全)
│ ├── plugin/ # 插件模块(二开目录)
│ ├── scripts/ # 初始化脚本和数据
│ └── utils/ # 工具类(验证码、文件上传等)
├── env/ # 环境配置文件
├── logs/ # 日志输出目录
├── sql/ # SQL 初始化脚本
├── static/ # 静态资源文件
├── main.py # CLI 入口(run 启动 / revision 生成迁移 / upgrade 应用迁移)
├── alembic.ini # Alembic 迁移配置
├── requirements.txt # Python 依赖包
└── pyproject.toml # 项目配置(uv / ruff)
模块分层
每个业务模块采用统一的分层结构:
modules/<模块>/<子域>/
├── controller.py # 控制器 - HTTP 请求处理
├── service.py # 服务层 - 业务逻辑处理
├── crud.py # 数据层 - 数据库操作
├── model.py # ORM 模型 - 数据库表定义
├── schema.py # Pydantic 模型 - 数据验证
└── param.py # 参数模型 - 请求参数
分包理念(按业务竖切 vs 按技术层次分包)详见 项目概述。
快速开始
环境要求
- Python: 3.12+
- 数据库: MySQL 8.0+ / PostgreSQL 13+ / SQLite 3.x(连接串在
env/.env.dev) - Redis: 与
.env.dev中配置一致
第一次在本机跑起来
- 复制
env/.env.example→env/.env.dev,填写数据库、Redis 等(先在 DB 中建好空库)。 - 在
backend/目录下 安装依赖:推荐uv sync;或pip install -r requirements.txt。 - 启动:
uv run main.py run --env=dev(或python main.py run --env=dev)。首次启动会自动初始化数据库表与基础数据,一般无需先执行upgrade。接口文档示例:http://127.0.0.1:8001/docs(端口见.env.dev中SERVER_PORT)。
数据库迁移命令(模型变更时使用)
日常首次启动不必手动执行;当你修改了 ORM 模型并需用 Alembic 管理结构变更时再使用:
# 生成迁移文件(模型变更后)
python main.py revision --env=dev
# 应用迁移
python main.py upgrade --env=dev
# 使用 uv 时
uv run main.py revision --env=dev
uv run main.py upgrade --env=dev
安装依赖与启动服务
# 推荐使用 uv(与 pyproject.toml 一致)
uv sync
uv run main.py run --env=dev
# 或使用传统 pip / venv
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python main.py run --env=dev
代码格式化(ruff)
ruff check
ruff check --fix
ruff check --watch
# 使用 uv 时
uv run ruff check
uv run ruff check --fix
uv run ruff check --watch
后端约定(日期与序列化)
使用 Pydantic v2 与 PostgreSQL(asyncpg) 时:ORM 写入需要 Python 原生日期时间,JSON 输出需要可序列化字符串。
- 自定义
DateStr/TimeStr/DateTimeStr(app/core/validator.py)使用PlainSerializer(..., when_used='json') model_dump(mode='python')供 ORM 使用原生类型;JSON / Redis 使用model_dump(mode='json')- 统一 HTTP 响应见
app/common/response.py中的jsonable_encoder - 写入 Redis 时请使用
model_dump(mode='json')再序列化
相关链接
- FastAPI 官方文档: https://fastapi.tiangolo.com/
- SQLAlchemy 文档: https://docs.sqlalchemy.org/
- Pydantic 文档: https://pydantic-docs.helpmanual.io/