Вы уже неплохо разобрались с FastAPI: есть база данных, аутентификация, а теперь, вероятно, ваш проект разрастается. Появляется всё больше эндпоинтов, и файл main.py превращается в непонятную простыню. Знакомо? Самое время навести порядок с помощью роутеров!

Что такое роутеры и зачем они нужны?

Роутеры — это способ разделить ваш код на модули. Представьте, что каждый роутер — это отдельный «блок» маршрутов, которые объединены одной логикой. Например:

  • users.py — маршруты для управления пользователями.
  • tasks.py — маршруты для работы с задачами.
  • auth.py — маршруты для аутентификации.

Такой подход упрощает поддержку и расширение проекта. Согласитесь, куда легче разобраться в компактных файлах, чем в монолитной махине на сотни строк.

Создаём первый роутер 🛠️

Начнём с простого примера. Допустим, у нас есть маршруты для пользователей.

Создаём файл routers/users.py:

from fastapi import APIRouter, HTTPException

# Создаём роутер
router = APIRouter()

# Простой эндпоинт для получения информации о пользователе
@router.get("/users/{user_id}")
def get_user(user_id: int):
    # Пока данные захардкожены
    fake_users_db = {1: "Alice", 2: "Bob", 3: "Charlie"}
    
    if user_id not in fake_users_db:
        raise HTTPException(status_code=404, detail="Пользователь не найден")
    
    return {"user_id": user_id, "username": fake_users_db[user_id]}

Что здесь происходит?

  • Создаём экземпляр APIRouter.
  • Описываем маршрут, используя @router.get().
  • Функция принимает user_id из URL и возвращает имя пользователя из фейковой базы данных.

Подключаем роутер к основному приложению 🔌

Теперь нам нужно интегрировать роутер в main.py:

from fastapi import FastAPI
from routers import users  # Импортируем наш роутер

app = FastAPI()

# Подключаем роутер
app.include_router(users.router)

@app.get("/")
def read_root():
    return {"message": "Добро пожаловать в наше приложение!"}

Разберём ключевую строку:

app.include_router(users.router) — подключает маршруты из users.py к основному приложению. Теперь они доступны по адресу /users/{user_id}.

Добавляем префиксы и теги для красоты 🌟

Иногда хочется, чтобы все маршруты одного роутера имели общий префикс. Например, чтобы вместо /users/{user_id} был /api/v1/users/{user_id}.

Давайте настроим это:

# routers/users.py

router = APIRouter(
    prefix="/api/v1/users",  # Общий префикс для всех маршрутов в этом роутере
    tags=["users"]  # Тег для удобной группировки в документации Swagger
)

@router.get("/{user_id}")
def get_user(user_id: int):
    fake_users_db = {1: "Alice", 2: "Bob", 3: "Charlie"}
    
    if user_id not in fake_users_db:
        raise HTTPException(status_code=404, detail="Пользователь не найден")
    
    return {"user_id": user_id, "username": fake_users_db[user_id]}

Теперь наш маршрут будет доступен по адресу: http://localhost:8000/api/v1/users/1

Организуем маршруты по категориям 📂

Давайте создадим ещё один роутер для задач:

Файл routers/tasks.py:

from fastapi import APIRouter, HTTPException

router = APIRouter(
    prefix="/api/v1/tasks",
    tags=["tasks"]
)

# Фейковая база данных задач
fake_tasks_db = {
    1: {"title": "Купить молоко", "completed": False},
    2: {"title": "Написать статью", "completed": True}
}

@router.get("/")
def get_all_tasks():
    return fake_tasks_db

@router.get("/{task_id}")
def get_task(task_id: int):
    task = fake_tasks_db.get(task_id)
    if not task:
        raise HTTPException(status_code=404, detail="Задача не найдена")
    return task

Подключаем его в main.py:

from fastapi import FastAPI
from routers import users, tasks

app = FastAPI()

# Подключаем оба роутера
app.include_router(users.router)
app.include_router(tasks.router)

@app.get("/")
def read_root():
    return {"message": "Добро пожаловать в наше приложение!"}

Теперь маршруты выглядят логично и структурированно:

  • http://localhost:8000/api/v1/users/1
  • http://localhost:8000/api/v1/tasks/

Swagger: маршруты на ладони 📜

Не забывайте про встроенную документацию FastAPI! Она автоматически подхватывает наши роутеры, префиксы и теги.

Откройте: http://localhost:8000/docs

Видите разделы users и tasks? Всё структурировано и понятно!

Заключение

Разделение маршрутов на логические модули — это не просто прихоть, а необходимость для поддерживаемого и масштабируемого проекта. С роутерами в FastAPI вы держите код под контролем: каждый модуль отвечает за свою часть логики, и вам не нужно ломать голову, где искать нужный эндпоинт.

Следующий шаг? Погрузимся в зависимые роутеры и более сложные примеры маршрутизации.