Notion Blog
知行合一1 分钟阅读

FastAPI 项目中合理的文件结构

在 FastAPI 项目中,合理的文件结构和命名规范可以提高代码的可读性和可维护性。以下是一个常见的多文件管理结构和命名建议,适用于中大型项目:


1. 项目结构示例

my_fastapi_project/
├── app/
│   ├── __init__.py
│   ├── main.py               # 应用入口
│   ├── core/                 # 核心配置和工具
│   │   ├── __init__.py
│   │   ├── config.py         # 配置文件
│   │   ├── security.py       # 认证和授权逻辑
│   │   └── utils.py          # 工具函数
│   ├── models/               # 数据库模型
│   │   ├── __init__.py
│   │   ├── user.py           # 用户模型
│   │   └── item.py           # 商品模型
│   ├── schemas/              # Pydantic 模型
│   │   ├── __init__.py
│   │   ├── user.py           # 用户相关模型
│   │   └── item.py           # 商品相关模型
│   ├── api/                  # API 路由
│   │   ├── __init__.py
│   │   ├── v1/               # 版本化 API
│   │   │   ├── __init__.py
│   │   │   ├── users.py      # 用户相关路由
│   │   │   └── items.py      # 商品相关路由
│   │   └── health_check.py   # 健康检查路由
│   ├── crud/                 # 数据库操作
│   │   ├── __init__.py
│   │   ├── user.py           # 用户相关操作
│   │   └── item.py           # 商品相关操作
│   ├── dependencies.py       # 依赖注入
│   ├── database.py           # 数据库连接
│   └── exceptions.py         # 自定义异常
├── tests/                    # 测试代码
│   ├── __init__.py
│   ├── test_users.py         # 用户相关测试
│   └── test_items.py         # 商品相关测试
├── requirements.txt          # 依赖文件
├── Dockerfile                # Docker 配置
└── README.md                 # 项目说明

2. 文件命名规范

核心文件

main.py: 应用入口文件,初始化 FastAPI 应用并加载路由。
database.py: 数据库连接和配置(如 SQLAlchemy 的 SessionLocal)。
dependencies.py: 依赖注入逻辑(如获取当前用户、数据库会话等)。
exceptions.py: 自定义异常处理。

核心模块 (core/)

config.py: 项目配置(如环境变量、数据库 URL 等)。
security.py: 认证和授权逻辑(如 JWT、OAuth2 等)。
utils.py: 工具函数(如日期处理、字符串处理等)。

模型模块 (models/)

user.py: 用户相关的数据库模型。
item.py: 商品相关的数据库模型。
其他模型文件按功能命名,如 order.pyproduct.py 等。

Pydantic 模型 (schemas/)

user.py: 用户相关的 Pydantic 模型(如 UserCreateUserResponse)。
item.py: 商品相关的 Pydantic 模型(如 ItemCreateItemResponse)。
其他模型文件按功能命名,如 order.pyproduct.py 等。

API 路由 (api/)

users.py: 用户相关的路由(如注册、登录、获取用户信息)。
items.py: 商品相关的路由(如创建商品、获取商品列表)。
health_check.py: 健康检查路由。
其他路由文件按功能命名,如 orders.pyproducts.py 等。

CRUD 操作 (crud/)

user.py: 用户相关的数据库操作(如创建用户、查询用户)。
item.py: 商品相关的数据库操作(如创建商品、查询商品)。
其他操作文件按功能命名,如 order.pyproduct.py 等。

测试模块 (tests/)

test_users.py: 用户相关的测试用例。
test_items.py: 商品相关的测试用例。
其他测试文件按功能命名,如 test_orders.pytest_products.py 等。

3. 命名建议

模块名: 使用小写字母和下划线(如 user.pyhealth_check.py)。
类名: 使用大驼峰命名法(如 UserCreateItemResponse)。
函数名: 使用小写字母和下划线(如 get_user_by_idcreate_item)。
变量名: 使用小写字母和下划线(如 current_userdb_session)。

4. 示例代码

app/main.py

from fastapi import FastAPI
from app.api.v1 import users, items

app = FastAPI()

app.include_router(users.router)
app.include_router(items.router)

app/api/v1/users.py

from fastapi import APIRouter, Depends
from app.schemas.user import UserCreate, UserResponse
from app.crud.user import create_user
from app.database import get_db

router = APIRouter()

@router.post("/users/", response_model=UserResponse)
def create_new_user(user: UserCreate, db=Depends(get_db)):
    return create_user(db, user)

app/schemas/user.py

from pydantic import BaseModel

class UserCreate(BaseModel):
    username: str
    email: str
    password: str

class UserResponse(BaseModel):
    id: int
    username: str
    email: str

app/crud/user.py

from app.models.user import User
from app.schemas.user import UserCreate

def create_user(db, user: UserCreate):
    db_user = User(username=user.username, email=user.email, password=user.password)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

app/models/user.py

from sqlalchemy import Column, Integer, String
from app.database import Base

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True)
    email = Column(String, unique=True)
    password = Column(String)

5. 总结

模块化: 按功能划分模块,如 models/schemas/api/ 等。
命名清晰: 文件名和类名应直观反映其功能。
一致性: 保持命名风格一致,便于团队协作和维护。

通过合理的文件结构和命名规范,可以使 FastAPI 项目更易于扩展和维护。

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。