一. 前言

FastAPI可能更倾向于使用模块化的方式,比如按功能划分目录。

二. 【fastapi】架构示例

1.适用于中大型项目的

myfastapi/
├── .env                    # 环境变量文件
├── .gitignore
├── Dockerfile
├── docker-compose.yml
├── requirements.txt        # 或使用 poetry/pipenv
├── README.md
│
├── src/                    # 项目主目录
│   ├── main.py             # 应用入口文件
│   │
│   ├── core/               # 核心配置
│   │   ├── config.py       # 配置加载
│   │   └── security.py     # 安全相关(如 JWT)
│   │
│   ├── api/                # API 路由
│   │   ├── v1/             # API 版本控制
│   │   │   ├── endpoints/
│   │   │   │   ├── auth.py
│   │   │   │   ├── users.py
│   │   │   │   └── items.py
│   │   │   └── routers.py  # 路由聚合
│   │   └── deps.py         # 路由依赖项
│   │
│   ├── models/             # 数据库模型
│   │   └── models.py
│   │
│   ├── schemas/            # Pydantic 模型
│   │   ├── auth.py
│   │   ├── user.py
│   │   └── item.py
│   │
│   ├── services/           # 业务逻辑
│   │   ├── auth_service.py
│   │   ├── user_service.py
│   │   └── item_service.py
│   │
│   ├── db/                 # 数据库相关
│   │   ├── session.py      # 数据库会话管理
│   │   ├── repositories/   # 数据库操作层(可选)
│   │   └── migrations/     # Alembic 迁移脚本
│   │
│   ├── utils/              # 工具类
│   │   ├── email.py
│   │   └── logger.py
│   │
│   ├── tests/              # 测试用例
│   │   ├── conftest.py
│   │   ├── test_auth.py
│   │   ├── test_users.py
│   │   └── test_items.py
│   │
│   ├── static/             # 静态文件
│   └── templates/          # Jinja2 模板(如果需要)
│
└── alembic.ini             # Alembic 配置

核心文件说明:

  1. main.py - 应用入口
from fastapi import FastAPI
from src.core.config import settings
from src.api.v1.routers import api_router

app = FastAPI(title=settings.PROJECT_NAME)
app.include_router(api_router, prefix="/api/v1")
  1. config.py - 配置管理
from pydantic import BaseSettings

class Settings(BaseSettings):
    PROJECT_NAME: str = "My FastAPI"
    DATABASE_URL: str
    
    class Config:
        env_file = ".env"
  1. 路由示例 (users.py)
from fastapi import APIRouter, Depends
from src.services.user_service import UserService

router = APIRouter()

@router.get("/users/{user_id}")
async def get_user(
    user_id: int,
    service: UserService = Depends()
):
    return service.get_user(user_id)
  1. 服务层示例 (user_service.py)
class UserService:
    def __init__(self, db_session: AsyncSession = Depends(get_db)):
        self.db = db_session

    async def get_user(self, user_id: int):
        # 业务逻辑实现
        return ...

2. 小型项目简化版

myapp/
├── main.py
├── config.py
├── routers/
│   ├── items.py
│   └── users.py
├── models/
├── schemas/
└── db.py

3. 企业级项目扩展:

  • 添加 celery_tasks/ 目录处理异步任务
  • 增加 client/ 目录存放第三方服务客户端
  • 创建 middlewares/ 目录自定义中间件
  • 添加 healthcheck/ 健康检查端点
  • 使用 domain/ 目录实现领域驱动设计

关键注意事项:

数据库迁移:

  • 使用 Alembic 进行数据库版本控制
  • 迁移脚本应放在 db/migrations/versions

测试建议:

  • 使用 pytest 编写测试用例
  • 添加集成测试和单元测试
  • 使用 TestClient 进行 API 测试

部署友好:

  • 添加 Prometheus 监控端点
  • 实现完善的日志记录
  • 添加 API 限流机制

安全实践:

  • 使用 CORSMiddleware 处理跨域
  • 实施 JWTOAuth2 认证
  • 输入验证使用 Pydantic 模型

异步支持:

  • 数据库驱动选择 async 版本(如 asyncpg
  • 使用 httpx 进行异步 HTTP 请求
  • 注意 async/await 的合理使用

项目架构遵循了关注点分离原则,符合现代 API 开发的最佳实践,能够很好地支持项目从开发到部署的全生命周期管理。实际项目中可以根据具体需求适当增减模块。

以上就是关于【fastapi】项目目录架构设计的基本介绍,后面会有详细的文章在进行讲解分析,希望对你有所帮助!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐