Перечислите основные модули, входящие в состав фреймворка FastAPI

Ответ

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"})

Вот и вся магия, ебать мои старые костыли. Ничего лишнего, всё на своих местах. Красота!