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