Skip to content

用 APIRouter 组织多文件项目 ​

为什么要拆分 ​

一个文件可以帮助你入门,但接口逐渐变多后,用户、任务、认证全部混在一起会越来越难维护。

初学阶段先分“入口、路由、数据模型、数据库”即可;业务复杂之后再引入服务层与数据访问层。

最小可运行结构 ​

text
project/
├── app/
│   ├── __init__.py
│   ├── main.py
│   └── routers/
│       ├── __init__.py
│       └── books.py
└── requirements.txt

两个 __init__.py 文件保持为空即可,帮助明确包结构。

文件 app/routers/books.py:

python
from fastapi import APIRouter

router = APIRouter(prefix="/books", tags=["图书"])


@router.get("")
def list_books():
    return [{"id": 1, "title": "Python 基础"}]


@router.get("/{book_id}")
def read_book(book_id: int):
    return {"id": book_id}

文件 app/main.py:

python
from fastapi import FastAPI
from app.routers import books

app = FastAPI(title="图书管理 API")
app.include_router(books.router, prefix="/api/v1")

在 project 目录运行:

powershell
python -m uvicorn app.main:app --reload

最终路由是 /api/v1/books 与 /api/v1/books/{book_id}。tags 用来在文档中分组;只有执行 include_router 后,这些路由才进入应用。官方多文件项目说明

项目扩大后的职责 ​

文件或目录适合放什么
main.py创建应用、注册路由、中间件、生命周期
routers/参数接收、调用业务逻辑、返回结果
schemas.py 或 schemas/请求与响应模型
models.py 或 models/数据库表模型
db.py数据库连接配置、初始化与相关依赖
services/多步骤业务处理
tests/自动化测试

schemas 与数据库 models 的命名是常见约定,不是 FastAPI 强制要求。重要的是职责清楚。

避免循环导入 ​

如果 main.py 导入路由,而路由又从 main.py 导入 app,就容易形成循环。路由使用自己的 APIRouter,公共配置与依赖放到独立模块,可以减少这种问题。

本章练习 ​

把图书与商品接口放到两个路由文件中,在入口统一加上 /api/v1 前缀。

过关标准:能找到项目入口、路由登记位置和最终完整请求路径。