FastAPI 构建 RESTful API 项目结构
随着项目不断增长,代码也会变得越来越复杂。为了保持清晰、可维护的架构,你需要将 FastAPI 应用拆分成多个模块,而不是将所有路由和逻辑都堆在一个 main.py
文件中。本章将带你搭建一个符合 RESTful API 设计风格的 FastAPI 项目结构,介绍如何组织代码、模块划分、依赖注入、模型定义等内容,帮助你为中大型项目打下坚实的基础。
为什么需要项目结构设计?
FastAPI 非常灵活,初学时你可以把所有内容放在一个文件中:
main.py
但随着接口越来越多、数据库逻辑增加、业务分层复杂,你会发现维护起来越来越困难。良好的项目结构有助于:
- 代码职责清晰
- 更容易测试和调试
- 方便多人协作开发
- 支持模块复用和拓展
推荐的项目结构示意图
fastapi_project/
├── app/
│ ├── api/ # 路由模块
│ │ ├── __init__.py
│ │ ├── deps.py # 通用依赖项
│ │ ├── v1/ # 版本化接口
│ │ │ ├── __init__.py
│ │ │ ├── items.py
│ │ │ └── users.py
│ ├── core/ # 配置/中间件/初始化逻辑
│ │ ├── __init__.py
│ │ ├── config.py
│ │ └── middleware.py
│ ├── crud/ # 数据库操作
│ │ ├── __init__.py
│ │ ├── crud_user.py
│ │ └── crud_item.py
│ ├── models/ # Pydantic 模型和 ORM 模型
│ │ ├── __init__.py
│ │ ├── user.py
│ │ └── item.py
│ ├── db/ # 数据库连接与初始化
│ │ ├── __init__.py
│ │ ├── session.py
│ │ └── base.py
│ ├── services/ # 业务逻辑
│ │ └── user_service.py
│ ├── main.py # 应用入口
├── tests/ # 测试模块
│ ├── __init__.py
│ └── test_users.py
├── requirements.txt
└── README.md
模块示例
1. main.py
FastAPI 应用的主入口,创建 FastAPI
实例、注册中间件和路由。通常运行这个文件来启动开发服务器。
main.py
from fastapi import FastAPI
from app.api.v1 import users, items
from app.core.middleware import register_middleware
app = FastAPI(title="My FastAPI App")
register_middleware(app)
app.include_router(users.router, prefix="/api/v1/users", tags=["Users"])
app.include_router(items.router, prefix="/api/v1/items", tags=["Items"])
2. app/api/v1/users.py
定义用户相关的 API 路由,例如查询用户、注册登录等。每个资源(如 users、items)都应有独立的路由模块。
app/api/v1/users.py
from fastapi import APIRouter, Depends
from app.models.user import User
from app.crud.crud_user import get_user_by_id
router = APIRouter()
@router.get("/{user_id}", response_model=User)
def read_user(user_id: int):
return get_user_by_id(user_id)
3. app/models/user.py
使用 Pydantic 定义用户数据结构,用于请求体、响应体的数据校验和文档生成。
app/models/user.py
from pydantic import BaseModel
class User(BaseModel):
id: int
username: str
email: str