Ответ
FastAPI имеет модульную структуру, где каждый компонент отвечает за конкретную задачу. Это делает фреймворк гибким и расширяемым.
Ключевые компоненты:
-
fastapi.FastAPI: Основной класс приложения, который объединяет всю логику, маршрутизацию и конфигурацию. -
fastapi.params: Классы для декларативного описания и валидации параметров запроса. Позволяют получать данные из разных источников с помощью dependency injection.Path(): для параметров пути (e.g.,/items/{item_id}).Query(): для query-параметров (e.g.,/items/?q=search).Body(): для данных из тела запроса.Header(),Cookie(): для заголовков и cookie.
-
fastapi.responses: Набор готовых классов для формирования различных HTTP-ответов.JSONResponse: стандартный ответ в формате JSON.HTMLResponse: для возврата HTML-страниц.RedirectResponse: для выполнения перенаправлений.
-
fastapi.security: Утилиты для реализации схем безопасности и аутентификации.OAuth2PasswordBearer: для OAuth2.HTTPBasic: для базовой аутентификации.
-
fastapi.exceptions: КлассHTTPExceptionдля удобной генерации HTTP-ошибок с заданным статус-кодом и сообщением. -
fastapi.encoders.jsonable_encoder: Функция для преобразования сложных типов данных (например, моделей Pydantic или SQLAlchemy) в JSON-совместимый формат.
Пример использования:
from fastapi import FastAPI, Path, HTTPException
from fastapi.responses import JSONResponse
from pydantic import BaseModel
# Основной класс приложения
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/items/{item_id}")
async def read_item(
# Использование Path для валидации параметра пути
item_id: int = Path(..., title="The ID of the item to get", ge=1)
):
if item_id > 100:
# Генерация стандартной HTTP-ошибки
raise HTTPException(status_code=404, detail="Item not found")
# Использование JSONResponse для ответа
return JSONResponse(content={"item_id": item_id, "name": "Sample Item"}) Ответ 18+ 🔞
Слушай, а знаешь, чем FastAPI реально хорош? Тем, что он не какой-нибудь монолит, который одним куском в жопу застрял. Нет, сука! Он как конструктор для взрослых дядек — всё по модулям разложено, каждый чих за свою хуйню отвечает. И расширяется это всё проще, чем мои штаны после новогоднего стола.
Вот смотри, из каких деталей этот паровозик собран:
-
fastapi.FastAPI: Это, блядь, главный начальник, сердце и печень приложения в одном флаконе. Вся маршрутизация, логика и прочая муть крутится вокруг него. -
fastapi.params: А это, ёпта, такие умные затычки для дырок, куда данные прилетают. Вместо того чтобы вручную из запроса всё выковыривать, ты просто говоришь: «Эй, дай-ка мне query-параметр, да чтоб не меньше пяти!» И он тебе его сам принесёт, проверит и в рот положит. Dependency injection, мать его.Path(): Для штук из самого пути URL, типа/items/{item_id}.Query(): Для всего, что после знака вопроса болтается (/items/?q=search).Body(): Ну, это когда тебе в теле запроса целый роман присылают.Header(),Cookie(): Для хитрожопых заголовков и вкусняшек-куки.
-
fastapi.responses: Тут лежат готовые шаблоны, чем клиенту в ответ плюнуть.JSONResponse: Классика жанра, JSON-чик.HTMLResponse: Если вдруг захотелось верстать странички, как в старые добрые.RedirectResponse: Чтобы послать пользователя куда подальше, но красиво.
-
fastapi.security: Охранники и вышибаалы. Хочешь пароли, токены, OAuth2? Бери, не стесняйся.OAuth2PasswordBearer: Для этой вашей модной OAuth2-авторизации.HTTPBasic: Старая добрая базовая аутентификация, проще пареной репы.
-
fastapi.exceptions: Главный герой тут —HTTPException. Хочешь красиво обосраться с ошибкой 404? Пожалуйста! Задал статус и текст — и клиент плачет, а не ты. -
fastapi.encoders.jsonable_encoder: Волшебная палочка, которая твои навороченные Pydantic-модели или SQLAlchemy-объекты превращает в простой, понятный JSON. Без неё иногда такую хуйню в ответе получаешь, что самому противно.
Ну и чтобы не быть голословным, вот тебе кусочек кода, как это всё в жизни выглядит:
from fastapi import FastAPI, Path, HTTPException
from fastapi.responses import JSONResponse
from pydantic import BaseModel
# Рождаем наше приложение-зверя
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/items/{item_id}")
async def read_item(
# Говорим: «item_id должен быть из пути И целым числом И больше или равно 1, ёба!»
item_id: int = Path(..., title="The ID of the item to get", ge=1)
):
if item_id > 100:
# А если нет, то лети нахуй с красивой ошибкой
raise HTTPException(status_code=404, detail="Item not found")
# А если всё ок, получай свой JSON, довольствуйся
return JSONResponse(content={"item_id": item_id, "name": "Sample Item"})
Вот и вся магия, ебать мои старые костыли. Ничего лишнего, всё на своих местах. Красота!