PRO

Как организовать роутеры (APIRouter) в большом проекте?

APIRouter позволяет группировать endpoints по доменам или ресурсам и подключать их к главному приложению через include_router(). В большом проекте роутеры обычно разделяют по функциональным модулям, а общие prefix, tags, dependencies и versioning задают на уровне router или его подключения.
Подробный ответ

Зачем нужен APIRouter

APIRouter помогает не хранить все endpoints в одном файле main.py. Каждый router объединяет связанные маршруты: например, пользователей, заказы, каталог, аутентификацию или внутренние административные API.

Пример структуры

app/
  main.py
  api/
    v1/
      routers/
        users.py
        articles.py
        auth.py
      router.py
  services/
  schemas/
  repositories/
  core/

Роутер ресурса

from fastapi import APIRouter

router = APIRouter(
    prefix='/articles',
    tags=['Articles'],
)


@router.get('/')
def get_articles():
    return []


@router.get('/{article_id}')
def get_article(article_id: int):
    return {'id': article_id}

Подключение к приложению

from fastapi import FastAPI
from app.api.v1.routers import articles, users

app = FastAPI()

app.include_router(articles.router, prefix='/api/v1')
app.include_router(users.router, prefix='/api/v1')

Практические правила

  • группировать роутеры по бизнес-доменам, а не по HTTP-методам;

  • держать endpoints тонкими и передавать бизнес-логику в services;

  • задавать общие prefix и tags на router;

  • подключать общие dependencies, например авторизацию, на уровне router;

  • разделять версии API через отдельные пакеты или общий prefix /api/v1.

Как ответить на собеседовании

В большом FastAPI-проекте я разделяю endpoints на APIRouter по доменам и подключаю их в точке сборки приложения через include_router(). Prefix, tags и общие dependencies задаю на уровне router, а бизнес-логику не храню в самих endpoints.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге