Как FastAPI обрабатывает маршрутизацию запросов

Ответ

FastAPI использует декораторы для привязки HTTP-запросов к функциям-обработчикам. В основе лежит Starlette, который обеспечивает высокопроизводительную маршрутизацию.

Ключевой принцип: Декоратор @app.<method>("/path") связывает HTTP-метод (GET, POST и т.д.) и URL-путь с асинхронной или синхронной функцией.

Пример:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()

# 1. Параметр пути (path parameter)
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    # item_id - обязательный параметр из URL
    # q - опциональный query-параметр (?q=...)
    return {"item_id": item_id, "q": q}

# 2. POST-запрос с телом (request body)
@app.post("/items/")
async def create_item(item: dict):
    return {"item_created": item}

Как это работает:

  1. Декораторы: @app.get, @app.post, @app.put и т.д. регистрируют функцию для конкретного пути и HTTP-метода.
  2. Тайп-хинтинг: FastAPI использует аннотации типов Python для валидации, сериализации и документирования данных. Например, item_id: int автоматически преобразует параметр пути в целое число и вернет ошибку 422, если это невозможно.
  3. Pydantic: Тела запросов (item: dict или, что лучше, модель Pydantic) автоматически парсятся из JSON и валидируются.
  4. APIRouter: Для структурирования больших приложений маршруты можно группировать с помощью APIRouter и подключать к основному приложению.
  5. Авто-документация: На основе этих маршрутов и моделей данных FastAPI автоматически генерирует интерактивную документацию OpenAPI (Swagger UI) и ReDoc.

Ответ 18+ 🔞

А, ну так вот, смотри, как эта штука, FastAPI, работает, блядь. Всё на декораторах, сука, построено, как будто ты ёлочку игрушками вешаешь, только вместо шариков — HTTP-запросы привязываешь. А под капотом у него Starlette сидит, который всё это дело с такой скоростью гоняет, что мама не горюй.

Суть, блядь, проще пареной репы: берёшь декоратор @app.<метод>("/путь") и навешиваешь на свою функцию. Всё, маршрут готов, можно чай пить. Функция может быть асинхронной или обычной — похуй, FastAPI разберётся.

Вот, смотри, пример, чтобы не быть пиздаболом:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()

# 1. Параметр пути (path parameter) — типа обязательная хуйня в самом URL
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    # item_id — вот эта переменная из URL, её уже в число превратили, если, конечно, не мудак какой в строку буквы напишет
    # q — это опциональный query-параметр, тот самый, что после знака вопроса в адресе тащится (?q=...)
    return {"item_id": item_id, "q": q}

# 2. POST-запрос, когда нужно не просто посмотреть, а сунуть какую-то хуйню в тело запроса
@app.post("/items/")
async def create_item(item: dict):
    return {"item_created": item}

А теперь, блядь, как это всё под капотом шевелится:

  1. Декораторы, ёпта: @app.get, @app.post и прочие — это как бирки на товаре. Говорят фреймворку: «Слышь, эта функция — для пути /items/{item_id} и метода GET, запомни, блядь». И он запоминает.
  2. Тайп-хинтинг, или Аннотации типов: Вот это, сука, магия! Ты просто пишешь item_id: int, а FastAPI уже сам: а) проверяет, что в URL число пришло, б) конвертирует его в int, в) если пришла какая-то хуйня вроде "abc" — сразу автоматом выдает пользователю красивую ошибку 422, мол, идиот, учи матчасть. И всё это бесплатно, блядь!
  3. Pydantic: А вот для тел запросов (это когда item: dict) лучше вообще не dict использовать, а специальные модели Pydantic объявлять. Это такие, блядь, умные классы, которые сами JSON распарсят, всё проверируют и в нужные типы превратят. Красота, а не жизнь.
  4. APIRouter: Когда приложение разрастается до овердохуища маршрутов, чтоб не сойти с ума, их можно по разным файлам раскидать и с помощью APIRouter сгруппировать. Потом все эти роутеры, как пазл, в основное приложение подключаешь.
  5. Авто-документация: А это вообще пиздец какой-то удобный бонус. FastAPI, глядя на твои маршруты и модели, сам, сука, генерирует интерактивную документацию в виде Swagger UI и ReDoc. Тыкаешь в браузере на /docs — и всё, можно АПИшку тестировать, не вставая с табуретки. Вообще, волшебство, ёпта.

Короче, инструмент охуенный, если понять эту простую механику с декораторами и типами. Работает быстро, как угорелый, и код получается чистый.