🎯3 分钟读完本文,你将获得:
- 一套开箱即用的企业级 FastAPI 项目架构
- 解决 FastAPI 项目从 Demo 到生产的所有痛点
- 掌握分层架构、自动迁移、缓存等最佳实践
- 节省至少 2 周的项目搭建时间
😫 你是否遇到过这些问题?
场景一:项目越写越乱
刚开始用 FastAPI 写项目时,所有代码都塞在main.py里:
# main.py - 500 行代码的噩梦@app.get("/users")asyncdefget_users():# 数据库查询# 业务逻辑# 数据验证# 返回结果# 全部混在一起...结果:代码难以维护,团队协作困难,新人看不懂,老人不想改。
场景二:数据库迁移是噩梦
每次修改数据库模型,都要手动写 SQL:
# 又加了一个字段,怎么办?classUser(Base):# ... 原有字段avatar:str# 新增字段 - 需要手动 ALTER TABLE结果:开发环境、测试环境、生产环境数据库结构不一致,上线就出 Bug。
场景三:接口性能问题
# 每次都查数据库,慢得要死@app.get("/hot-data")asyncdefget_hot_data():returnawaitdb.query(...)# 这个接口被调用 1000 次/秒结果:数据库压力大,响应慢,用户体验差。
场景四:异常处理不统一
# 到处都是 try-except,返回格式五花八门try:result=awaitsome_operation()return{"code":200,"data":result}exceptExceptionase:return{"error":str(e)}# 另一个接口返回 {"msg": str(e)}结果:前端对接困难,错误难以追踪。
💡 解决方案:FastAPI Best Architecture
我基于 Dash-FastAPI-Admin 的优秀设计,结合实际项目经验,打造了这套开箱即用的企业级架构模板。
GitHub 地址:https://github.com/LijiangTn/fastapi-best-architecture
⭐ 核心亮点
1️⃣ 清晰的分层架构
Controller(路由层) ↓ 只负责接收请求和返回响应 Service(业务层) ↓ 处理业务逻辑 DAO(数据访问层) ↓ 封装数据库操作 Entity(实体层) ↓ 定义数据模型代码示例:
# Controller - 简洁明了@userController.get('/list')asyncdefget_user_list(db:AsyncSession=Depends(get_db),user_filter:UserFilter=FilterDepends(UserFilter)):query=UserService.get_user_list_query(user_filter)result=awaitpaginate(db,query)returnResponseUtil.success(data=result)# Service - 业务逻辑classUserService:@classmethoddefget_user_list_query(cls,user_filter=None):returnUserDao.get_user_list_query(user_filter)# DAO - 数据库操作classUserDao:@classmethoddefget_user_list_query(cls,user_filter=None):query=select(UserManager).where(UserManager.is_deleted==0)ifuser_filter:query=user_filter.filter(query)returnquery好处:
- ✅ 职责清晰,易于维护
- ✅ 团队协作不冲突
- ✅ 单元测试更容易
- ✅ 代码复用率高
2️⃣ 智能数据库迁移
再也不用手动写 ALTER TABLE 了!
# 只需修改模型classUser(Base):__tablename__='user_manager'id=Column(Integer,primary_key=True)username=Column(String(50),nullable=False)avatar=Column(String(255))# 新增字段启动项目,自动迁移:
============================================================ 开始执行数据库迁移... ============================================================ 正在迁移表: user_manager 添加 1 个字段到 user_manager ✓ avatar ✓ user_manager 迁移成功 ============================================================ ✓ 数据库迁移全部完成 ============================================================特性:
- ✅ 自动对比模型和数据库结构
- ✅ 智能生成 ALTER TABLE 语句
- ✅ 支持字段类型、默认值、注释
- ✅ 安全的事务处理,失败自动回滚
3️⃣ 一行代码实现接口缓存
fromfastapi_cache.decoratorimportcache@userController.get('/list')@cache(expire=120)# 缓存 2 分钟asyncdefget_user_list(...):# 第一次查数据库,之后走 Redispass效果:
- 🚀 接口响应从 200ms 降到 5ms
- 💰 数据库压力降低 90%
- 😊 用户体验显著提升
4️⃣ 强大的查询过滤器
支持复杂查询,无需手写 SQL:
# 定义过滤器classUserFilter(Filter):username__ilike:Optional[str]# 模糊查询email__ilike:Optional[str]is_active:Optional[int]create_time__gte:Optional[datetime]# 时间范围create_time__lte:Optional[datetime]order_by:list[str]=["-create_time"]# 排序使用示例:
# 基础分页GET /api/v1/user/list?page=1&size=20# 用户名模糊查询GET /api/v1/user/list?username__ilike=zhang# 时间范围 + 状态筛选 + 排序GET /api/v1/user/list?create_time__gte=2024-01-01&is_active=1&order_by=-create_time支持的操作符:
eq- 等于neq- 不等于gt/gte- 大于/大于等于lt/lte- 小于/小于等于like/ilike- 模糊查询(区分/不区分大小写)in/not_in- 包含/不包含isnull/notnull- 为空/不为空
5️⃣ 统一响应格式
所有接口返回格式一致:
{"code":200,"msg":"操作成功","data":{...},"success":true,"time":"2024-12-12T10:30:00"}使用方式:
# 成功returnResponseUtil.success(data=result)# 失败returnResponseUtil.failure(msg="用户名已存在")# 错误returnResponseUtil.error(msg="系统异常")# 未授权returnResponseUtil.unauthorized(msg="登录已过期")好处:
- ✅ 前端对接简单
- ✅ 错误处理统一
- ✅ 日志追踪方便
6️⃣ 完善的异常处理
全局异常捕获,再也不用到处写 try-except:
# 自定义异常classServiceException(Exception):"""服务异常"""pass# 业务代码中直接抛出ifnotuser:raiseServiceException("用户不存在")# 全局异常处理器自动捕获并返回统一格式# 无需手动处理支持的异常类型:
AuthException- 认证异常(401)PermissionException- 权限异常(403)ServiceException- 服务异常(500)ServiceWarning- 业务警告(200)ModelValidatorException- 模型验证异常
7️⃣ 智能日志管理
基于 Loguru,自动分级存储:
fromutils.log_utilimportlogger logger.info("用户登录成功")logger.warning("密码错误次数过多")logger.error("数据库连接失败")日志文件:
logs/FasAPIStarter_error_2024-12-12.log- 错误日志logs/FasAPIStarter_other_2024-12-12.log- 其他日志
特性:
- ✅ 自动按日期分文件
- ✅ 自动压缩归档
- ✅ 支持日志轮转(50MB)
- ✅ 彩色终端输出
🚀 快速开始
1. 克隆项目
gitclone https://github.com/LijiangTn/fastapi-best-architecture.gitcdfastapi-best-architecture2. 安装依赖
pipinstall-r requirements.txt3. 配置环境
修改.env.dev文件:
# 数据库配置DB_HOST=localhostDB_PORT=3306DB_USERNAME=rootDB_PASSWORD=your_passwordDB_DATABASE=your_database# Redis 配置REDIS_HOST=localhostREDIS_PORT=63794. 启动服务
python main.py5. 访问文档
打开浏览器访问:http://localhost:8081/api/docs
📦 技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| FastAPI | 0.115.0 | 高性能 Web 框架 |
| SQLAlchemy | 2.0.31 | 异步 ORM |
| Pydantic | 2.10.5 | 数据验证 |
| Redis | 5.0.7 | 缓存数据库 |
| Loguru | 0.7.2 | 日志库 |
| APScheduler | 3.10.4 | 定时任务 |
🎯 适用场景
✅ 适合你,如果你:
- 🆕 刚开始学习 FastAPI,想要一个规范的项目结构
- 🏢 需要快速搭建企业级后端服务
- 👥 团队协作开发,需要统一的代码规范
- 🚀 追求高性能、高可维护性的项目架构
- 📚 想学习 FastAPI 最佳实践
❌ 不适合你,如果你:
- 只是写个简单的 Demo(用不上这么复杂的架构)
- 不需要数据库和缓存
- 喜欢自己从零搭建(那你可以参考学习)
📊 项目对比
| 特性 | 传统写法 | FastAPI Best Architecture |
|---|---|---|
| 项目结构 | 混乱,难以维护 | ✅ 清晰的分层架构 |
| 数据库迁移 | 手动写 SQL | ✅ 自动智能迁移 |
| 接口缓存 | 需要手动实现 | ✅ 装饰器一行搞定 |
| 查询过滤 | 手写复杂 SQL | ✅ 声明式过滤器 |
| 异常处理 | 到处 try-except | ✅ 全局统一处理 |
| 响应格式 | 五花八门 | ✅ 统一格式 |
| 日志管理 | print 调试 | ✅ 分级存储 |
| 上手难度 | 需要自己摸索 | ✅ 开箱即用 |
🤝 贡献与支持
如何贡献
欢迎提交 Issue 和 Pull Request!
- 🐛 发现 Bug?提交 Issue
- 💡 有好的想法?发起讨论
- 🔧 想要贡献代码?Fork 项目并提交 PR
支持项目
如果这个项目对你有帮助,请:
- ⭐ 给项目点个 Star
- 🔗 分享给你的朋友
- 📝 写一篇使用体验文章
📚 相关资源
- 项目地址:https://github.com/LijiangTn/fastapi-best-architecture
- FastAPI 官方文档:https://fastapi.tiangolo.com
- SQLAlchemy 文档:https://docs.sqlalchemy.org
- 原始项目:https://github.com/HogaStack/Dash-FastAPI-Admin
🎉 总结
FastAPI Best Architecture 不仅仅是一个项目模板,更是一套经过实战验证的最佳实践。
你将获得:
✅节省时间- 不用再从零搭建项目架构
✅提升质量- 遵循最佳实践,代码更规范
✅加速开发- 开箱即用的功能模块
✅降低风险- 完善的异常处理和日志系统
✅易于维护- 清晰的分层架构
立即开始
gitclone https://github.com/LijiangTn/fastapi-best-architecture.gitcdfastapi-best-architecture pipinstall-r requirements.txt python main.py3 分钟,你就能拥有一个企业级的 FastAPI 项目!
如果觉得有用,别忘了给个 ⭐️ Star!
Made with ❤️ by Li Jiang