Какие инструменты и библиотеки часто используются с FastAPI?

Ответ

FastAPI — это современный, быстрый (высокопроизводительный) веб-фреймворк для создания API на Python, который активно использует стандартные типы Python и Pydantic для валидации данных. Его модульная архитектура позволяет легко интегрировать множество сторонних инструментов и библиотек для расширения функциональности:

  1. Pydantic: Является основой FastAPI для валидации, сериализации и десериализации данных. Он используется для определения схем запросов и ответов, автоматической генерации документации OpenAPI и обеспечения безопасности типов. Хотя Pydantic встроен, его возможности часто расширяются для более сложной валидации или трансформации данных.

  2. SQLAlchemy + Alembic: Это наиболее популярная связка для работы с реляционными базами данных. SQLAlchemy — мощный ORM (Object-Relational Mapper), а Alembic — инструмент для управления миграциями базы данных. Они позволяют эффективно взаимодействовать с БД, определять модели и управлять изменениями схемы.

    Пример интеграции SQLAlchemy с FastAPI (упрощенно):

    from fastapi import FastAPI, Depends, HTTPException
    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, Session
    
    # Конфигурация базы данных
    SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
    engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    Base = declarative_base()
    
    # Определение модели SQLAlchemy
    class Item(Base):
        __tablename__ = "items"
        id = Column(Integer, primary_key=True, index=True)
        name = Column(String, index=True)
    
    Base.metadata.create_all(bind=engine) # Создание таблиц
    
    app = FastAPI()
    
    # Зависимость для получения сессии БД
    def get_db():
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    @app.post("/items/")
    def create_item(name: str, db: Session = Depends(get_db)):
        db_item = Item(name=name)
        db.add(db_item)
        db.commit()
        db.refresh(db_item)
        return {"id": db_item.id, "name": db_item.name}

    Примечание: В реальных проектах рекомендуется использовать Dependency Injection для управления сессиями базы данных, как показано в get_db.

  3. Starlette: FastAPI построен на Starlette, который является легковесным ASGI-фреймворком. Хотя напрямую с ним редко взаимодействуют, понимание его принципов полезно для глубокой настройки и расширения FastAPI.

  4. Uvicorn / Hypercorn: Это ASGI-серверы, необходимые для запуска FastAPI-приложений в продакшене. Uvicorn является наиболее распространенным выбором благодаря своей производительности и простоте использования.

  5. Tortoise-ORM: Асинхронный ORM, который хорошо подходит для FastAPI, если требуется полностью асинхронный стек работы с базой данных. Он предоставляет удобный синтаксис для определения моделей и выполнения запросов.

  6. Redis (через aioredis или redis-py): Используется для кеширования, управления сессиями, брокеров сообщений (например, для Celery) или как хранилище для быстрых временных данных. aioredis предоставляет асинхронный клиент, идеально подходящий для FastAPI.

  7. CeleryRabbitMQ или Redis в качестве брокера): Для выполнения фоновых задач, которые не должны блокировать основной поток веб-сервера (например, отправка email, обработка изображений, длительные вычисления). RabbitMQ или Redis используются как брокеры сообщений для Celery.

  8. Jinja2: Если помимо API требуется рендерить HTML-страницы (например, для админ-панели или простых веб-интерфейсов), Jinja2 — популярный и мощный шаблонизатор, который легко интегрируется с FastAPI.

Эти инструменты в совокупности позволяют создавать высокопроизводительные, масштабируемые и надежные веб-приложения и API на базе FastAPI.

Ответ 18+ 🔞

Слушай, а вот этот FastAPI — это ж просто пиздец какой удобный инструмент, ей-богу. Современный, быстрый, на Python. Создаёшь API, а он сам за тебя половину работы делает: типы проверяет, документацию генерирует. Красота, а не фреймворк.

А знаешь, на чём вся эта магия держится? Ну, кроме самого Python, конечно. Сейчас разложу по полочкам, что там обычно в проектах болтается.

Pydantic — это, блядь, основа основ. Без него нихуя. Все твои схемы, валидация данных, сериализация — это всё он. Типа ты описал, как должны выглядеть данные, а он уже сам всё проверит, и если какая-то хуйня прилетела — сразу ошибку красивую выкинет. И документацию из этого всего сам нарисует. Просто волшебство, ёпта.

SQLAlchemy + Alembic — это классика жанра для работы с базами данными. ORM, который с БД общается почти как с обычными питоновскими объектами. А Alembic — это чтобы миграциями управлять, когда схему базы меняешь. Без него — пиздец и ручное управление, а с ним — красота.

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

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

# Конфигурация базы данных
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

# Определение модели SQLAlchemy
class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)

Base.metadata.create_all(bind=engine) # Создание таблиц

app = FastAPI()

# Зависимость для получения сессии БД
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/items/")
def create_item(name: str, db: Session = Depends(get_db)):
    db_item = Item(name=name)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return {"id": db_item.id, "name": db_item.name}

Заметка: В нормальных проектах сессии именно так и получают, через Dependency Injection, как в get_db. Не надо их вручную открывать-закрывать, а то наебнёшься.

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

Uvicorn / Hypercorn — а это уже серверы, на которых это всё дело в продакшене бегает. Без них твой красивый код — просто скрипт. Uvicorn — самый популярный, быстрый и простой. Запустил — и поехали.

А если хочешь всё полностью в асинхронном режиме, то Tortoise-ORM тебе в руки. ORM, который заточен под async/await. С ним асинхронные запросы к базе делаешь, и всё летает.

Redis (через aioredis) — это когда нужно что-то быстрое, типа кеша, сессий или очередей для фоновых задач. Асинхронный клиент — то, что надо для FastAPI, чтобы не тормозить.

CeleryRabbitMQ или Redis) — вот это мощь, блядь. Когда нужно какую-то тяжёлую задачу в фоне выполнить — отправить сто писем, обработать гигабайты данных. Основное приложение не ждёт, отдаёт задачу Celery, а тот уже сам в отдельном процессе её мутузит. RabbitMQ или Redis тут как почтальоны — передают задания.

Ну и если вдруг понадобится не только JSON отдавать, а целые HTML-страницы рендерить (админку какую или простой фронт), то Jinja2 — твой выбор. Шаблонизатор, проверенный временем, встраивается за пять минут.

Вот такая, блядь, компания собирается вокруг FastAPI. Всё вместе — это овердохуища возможностей, чтобы делать быстрые, надёжные и масштабируемые приложения. Главное — не переборщить со всем этим в одном проекте, а то получится монстр, а не API.