🎯 3 分钟读完本文,你将获得:
- 一套开箱即用的企业级 FastAPI 项目架构
- 解决 FastAPI 项目从 Demo 到生产的所有痛点
- 掌握分层架构、自动迁移、缓存等最佳实践
- 节省至少 2 周的项目搭建时间
😫 你是否遇到过这些问题?
场景一:项目越写越乱
刚开始用 FastAPI 写项目时,所有代码都塞在 main.py 里:
python
# main.py - 500 行代码的噩梦
@app.get("/users")
async def get_users():
# 数据库查询
# 业务逻辑
# 数据验证
# 返回结果
# 全部混在一起...
结果: 代码难以维护,团队协作困难,新人看不懂,老人不想改。
场景二:数据库迁移是噩梦
每次修改数据库模型,都要手动写 SQL:
python
# 又加了一个字段,怎么办?
class User(Base):
# ... 原有字段
avatar: str # 新增字段 - 需要手动 ALTER TABLE
结果: 开发环境、测试环境、生产环境数据库结构不一致,上线就出 Bug。
场景三:接口性能问题
python
# 每次都查数据库,慢得要死
@app.get("/hot-data")
async def get_hot_data():
return await db.query(...) # 这个接口被调用 1000 次/秒
结果: 数据库压力大,响应慢,用户体验差。
场景四:异常处理不统一
python
# 到处都是 try-except,返回格式五花八门
try:
result = await some_operation()
return {"code": 200, "data": result}
except Exception as e:
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(实体层)
↓ 定义数据模型
代码示例:
python
# Controller - 简洁明了
@userController.get('/list')
async def get_user_list(
db: AsyncSession = Depends(get_db),
user_filter: UserFilter = FilterDepends(UserFilter)
):
query = UserService.get_user_list_query(user_filter)
result = await paginate(db, query)
return ResponseUtil.success(data=result)
# Service - 业务逻辑
class UserService:
@classmethod
def get_user_list_query(cls, user_filter=None):
return UserDao.get_user_list_query(user_filter)
# DAO - 数据库操作
class UserDao:
@classmethod
def get_user_list_query(cls, user_filter=None):
query = select(UserManager).where(UserManager.is_deleted == 0)
if user_filter:
query = user_filter.filter(query)
return query
好处:
- ✅ 职责清晰,易于维护
- ✅ 团队协作不冲突
- ✅ 单元测试更容易
- ✅ 代码复用率高
2️⃣ 智能数据库迁移
再也不用手动写 ALTER TABLE 了!
python
# 只需修改模型
class User(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️⃣ 一行代码实现接口缓存
python
from fastapi_cache.decorator import cache
@userController.get('/list')
@cache(expire=120) # 缓存 2 分钟
async def get_user_list(...):
# 第一次查数据库,之后走 Redis
pass
效果:
- 🚀 接口响应从 200ms 降到 5ms
- 💰 数据库压力降低 90%
- 😊 用户体验显著提升
4️⃣ 强大的查询过滤器
支持复杂查询,无需手写 SQL:
python
# 定义过滤器
class UserFilter(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"] # 排序
使用示例:
bash
# 基础分页
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️⃣ 统一响应格式
所有接口返回格式一致:
json
{
"code": 200,
"msg": "操作成功",
"data": {...},
"success": true,
"time": "2024-12-12T10:30:00"
}
使用方式:
python
# 成功
return ResponseUtil.success(data=result)
# 失败
return ResponseUtil.failure(msg="用户名已存在")
# 错误
return ResponseUtil.error(msg="系统异常")
# 未授权
return ResponseUtil.unauthorized(msg="登录已过期")
好处:
- ✅ 前端对接简单
- ✅ 错误处理统一
- ✅ 日志追踪方便
6️⃣ 完善的异常处理
全局异常捕获,再也不用到处写 try-except:
python
# 自定义异常
class ServiceException(Exception):
"""服务异常"""
pass
# 业务代码中直接抛出
if not user:
raise ServiceException("用户不存在")
# 全局异常处理器自动捕获并返回统一格式
# 无需手动处理
支持的异常类型:
AuthException- 认证异常(401)PermissionException- 权限异常(403)ServiceException- 服务异常(500)ServiceWarning- 业务警告(200)ModelValidatorException- 模型验证异常
7️⃣ 智能日志管理
基于 Loguru,自动分级存储:
python
from utils.log_util import logger
logger.info("用户登录成功")
logger.warning("密码错误次数过多")
logger.error("数据库连接失败")
日志文件:
logs/FasAPIStarter_error_2024-12-12.log- 错误日志logs/FasAPIStarter_other_2024-12-12.log- 其他日志
特性:
- ✅ 自动按日期分文件
- ✅ 自动压缩归档
- ✅ 支持日志轮转(50MB)
- ✅ 彩色终端输出
🚀 快速开始
1. 克隆项目
bash
git clone https://github.com/LijiangTn/fastapi-best-architecture.git
cd fastapi-best-architecture
2. 安装依赖
bash
pip install -r requirements.txt
3. 配置环境
修改 .env.dev 文件:
bash
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=your_password
DB_DATABASE=your_database
# Redis 配置
REDIS_HOST=localhost
REDIS_PORT=6379
4. 启动服务
bash
python main.py
5. 访问文档
打开浏览器访问: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!
支持项目
如果这个项目对你有帮助,请:
- ⭐ 给项目点个 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 不仅仅是一个项目模板,更是一套经过实战验证的最佳实践。
你将获得:
✅ 节省时间 - 不用再从零搭建项目架构
✅ 提升质量 - 遵循最佳实践,代码更规范
✅ 加速开发 - 开箱即用的功能模块
✅ 降低风险 - 完善的异常处理和日志系统
✅ 易于维护 - 清晰的分层架构
立即开始
bash
git clone https://github.com/LijiangTn/fastapi-best-architecture.git
cd fastapi-best-architecture
pip install -r requirements.txt
python main.py
3 分钟,你就能拥有一个企业级的 FastAPI 项目!
如果觉得有用,别忘了给个 ⭐️ Star!
Made with ❤️ by Li Jiang