Skip to content

tel-ran-de/141024-m-pt-microservices-api

Repository files navigation

Проект "Бюро находок"

Запуск проекта

  1. Создайте виртуальное окружение
  2. Установите зависимости из файла requirements.txt
  3. Создайте файл .env.local, используя .env.local.examples
  4. Создайте DB, используя параметры из .env.local
  5. Примените миграции
    alembic upgrade head 
  6. Запустите сервер
    uvicorn main:app --reload

Запуск автотестов

  1. Создайте тестовую DB, используя параметры из .env.local
  2. Запустите автотесты
    pytest -v

History

Урок 10

  • добавили зависимости в requirements.txt
  • создали .gitignore

commit: Урок 10: init

1. Основные файлы и конфигурация

  • main.py:

    • Этот файл является точкой входа в ваше FastAPI приложение.
    • Он инициализирует приложение FastAPI и подключает маршрутизаторы (routers) для обработки запросов, связанных с потерянными и найденными предметами.
    • Содержит базовый эндпоинт /, который возвращает приветственное сообщение.
  • config.py:

    • Содержит настройки приложения, такие как параметры подключения к базе данных.
    • Использует Pydantic для валидации и загрузки переменных окружения из файла .env.local.
  • .env.local.example:

    • Пример файла переменных окружения, который используется для настройки параметров базы данных и других конфигураций.
    • Пользователи должны создать файл .env.local на основе этого примера и заполнить его своими данными.

2. База данных и модели

  • database.py:

    • Настраивает подключение к базе данных с использованием SQLAlchemy.
    • Создает асинхронный движок и сессию для взаимодействия с базой данных.
  • models.py:

    • Определяет модели данных для таблиц lost_items и found_items.
    • Использует SQLAlchemy ORM для определения структуры таблиц и их полей.
    • Каждая модель соответствует таблице в базе данных и определяет поля, такие как id, name, description, date, и location.

3. Маршрутизаторы и эндпоинты

  • routers/lost_items.py и routers/found_items.py:
    • Определяют маршрутизаторы для обработки HTTP-запросов, связанных с потерянными и найденными предметами.
    • Каждый маршрутизатор содержит CRUD (Create, Read, Update, Delete) операции для соответствующих моделей.
    • Используют Pydantic схемы для валидации входных данных и сериализации ответов.

4. Схемы данных

  • schemas.py:
    • Определяет Pydantic схемы для валидации данных, поступающих в API, и для сериализации данных, возвращаемых из API.
    • Содержит схемы для создания, обновления и чтения потерянных и найденных предметов.

5. Тестирование

  • conftest.py:

    • Содержит фикстуры для настройки тестовой базы данных и клиента FastAPI.
    • Использует pytest и pytest-asyncio для асинхронного тестирования.
    • Фикстуры обеспечивают изоляцию тестов, создавая и уничтожая тестовую базу данных перед и после выполнения тестов.
  • test_found_items.py и test_lost_items.py:

    • Содержат тесты для проверки функциональности эндпоинтов, связанных с найденными и потерянными предметами.
    • Включают тесты для создания, чтения, обновления и удаления предметов, а также проверки на корректность обработки ошибок (например, когда предмет не найден).

6. Миграции базы данных

  • alembic.ini и alembic/env.py:

    • Конфигурационные файлы для Alembic, инструмента для управления миграциями базы данных.
    • alembic.ini содержит основные настройки, такие как путь к скриптам миграций.
    • env.py настраивает окружение для выполнения миграций, подключаясь к базе данных и используя метаданные моделей.
  • 789953bf9c87_init_migrations.py:

    • Автоматически сгенерированная миграция, которая создает таблицы found_items и lost_items в базе данных.
    • Содержит команды для создания и удаления таблиц и индексов.

commit: Урок 10: создан простой FastAPI проект

Урок 11

  1. Обновление README.md:

    • Добавлен новый раздел "Урок 11", который описывает команды для создания и применения миграции, добавляющей категории к потерянным предметам.
    • Указаны команды alembic revision --autogenerate -m "add category to lost items" и alembic upgrade head для генерации и применения миграции.
  2. Изменения в models.py:

    • Добавлена новая модель Category, представляющая категории, к которым могут относиться потерянные предметы.
    • В модель LostItem добавлены поля category_id и category, которые устанавливают связь с моделью Category.
    • Используется relationship для установки двусторонней связи между LostItem и Category.
  3. Изменения в routers/lost_items.py:

    • В маршруте создания потерянного предмета добавлена проверка существования категории по category_id.
    • Если категория не найдена, возвращается ошибка 404 Not Found.
  4. Изменения в schemas.py:

    • В схему LostItemBase добавлено поле category_id для валидации данных, связанных с категорией.
    • Добавлены новые схемы CategoryCreate, CategoryUpdate, и CategoryRead для работы с категориями.
    • Эти схемы позволяют создавать, обновлять и читать данные категорий, обеспечивая валидацию и сериализацию.

Зачем нужны эти изменения:

  • Введение категорий позволяет лучше структурировать данные о потерянных предметах, упрощая их фильтрацию и организацию.

  • Проверка существования категории при создании предмета предотвращает ошибки, связанные с несуществующими категориями.

  • Новые схемы для категорий обеспечивают согласованность и валидацию данных на уровне API.

  • создание файла миграции: alembic revision --autogenerate -m "add category to lost items"

  • после этого нужно внести изменения в новый файл миграций в разделах upgrade и downgrade для того чтобы можно было накатить миграции на непустую базу.

  • после внесения изменений в файл миграции, применить миграцию: alembic upgrade head

commit: Урок 11: добавлены категории к потерянным предметам

  1. Изменения в models.py:
    • В модель Category добавлено поле found_items, которое устанавливает связь с моделью FoundItem.
    • В модель FoundItem добавлены поля category_id и category, которые устанавливают связь с моделью Category.
    • Используется relationship для установки двусторонней связи между FoundItem и Category.

Зачем нужны эти изменения:

  • Введение категорий для найденных предметов позволяет лучше структурировать данные, упрощая их фильтрацию и организацию.

  • Связь между FoundItem и Category обеспечивает согласованность данных и позволяет легко определять, к какой категории относится найденный предмет.

  • Обновление README.md помогает пользователям понять, как создавать и применять миграции, а также учитывать особенности работы с непустой базой данных.

  • создание файла миграции: alembic revision --autogenerate -m "add category to found items"

  • после этого нужно внести изменения в новый файл миграций в разделах upgrade и downgrade для того чтобы можно было накатить миграции на непустую базу.

  • после внесения изменений в файл миграции, применить миграцию: alembic upgrade head

commit: Урок 11 (ПРАКТИКА): добавлены категории к найденным предметам

  1. Обновление main.py:

    • Добавлен новый маршрутизатор categories_router для обработки запросов, связанных с категориями.
    • Подключен маршрутизатор к основному приложению FastAPI с префиксом /categories и тегом ["categories"].
  2. Изменения в routers/found_items.py:

    • В маршруте создания найденного предмета добавлена проверка существования категории по category_id.
    • Если категория не найдена, возвращается ошибка 404 Not Found.
  3. Изменения в schemas.py:

    • В схему FoundItemBase добавлено поле category_id для валидации данных, связанных с категорией.
    • Это позволяет убедиться, что при создании найденного предмета указывается существующая категория.

Зачем нужны эти изменения:

  • Введение маршрутизатора для категорий позволяет управлять категориями через API, добавляя, обновляя и удаляя их.
  • Проверка существования категории при создании найденного предмета предотвращает ошибки, связанные с несуществующими категориями.
  • Обновление схемы для найденных предметов обеспечивает согласованность и валидацию данных на уровне API.

commit: Урок 11 (ПРАКТИКА): добавлены маршрутизаторы для категорий и связаны найденные предметы с категориями

commit: Урок 11 (FIX): хотфикс, настройки подключения к БД

Урок 12

добавляем данные в БД для будущих экспериментов

  • создание файла миграции: alembic revision --autogenerate -m "add category to found items"
  • после этого нужно внести изменения в новый файл миграций в разделах upgrade и downgrade для того чтобы можно было накатить миграции на непустую базу.
  • после внесения изменений в файл миграции, применить миграцию: alembic upgrade head

commit: Урок 12: добавлены данные в БД

Пагинация, сортировка, фильтрация

Краткие пояснения

  1. session = AsyncSessionLocal()
    Создаём асинхронную сессию, чтобы иметь доступ к базе данных через SQLAlchemy.
  2. await session.execute(query)
    Выполняем асинхронный SQL-запрос (т.к. находимся внутри async def main():). Если бы это был чисто синхронный контекст, обернули бы в asyncio.run(...). Но здесь у нас всё в async def.
  3. select(...) — построение SQL-запроса.
    • .offset(N).limit(M) — пагинация (пропускаем N, берём M).
    • .where(условие) — фильтрация.
    • .order_by(...) — сортировка.
  4. .scalars().all()
    Преобразует результат (курсор) в обычный Python-список объектов (LostItem / FoundItem).
  5. print(...)
    Выводим на экран результаты, чтобы убедиться, что запрос возвращает нужные записи.

Как запустить

  1. Сохраните этот код в файл, например test_db.py.
  2. В терминале/консоли выполните:
    python test_db.py
  3. Скрипт последовательно покажет:
    • Пагинацию (две «страницы»).
    • Фильтрацию (три разных условия).
    • Сортировку (три разных способа).

При таком подходе весь код выполняется внутри одного asyncio.run(...), и не возникает проблем с «Event loop is closed».

commit: Урок 12: примеры для консоли

commit: Урок 12 (ПРАКТИКА): пагинация, фильтрация, сортировка

commit: Урок 12 (РЕШЕНИЕ): пагинация, фильтрация, сортировка

Ниже пример, как внедрить пагинацию, фильтрацию и сортировку непосредственно в роутер lost_items.py. Мы добавляем в эндпоинт GET /lost_items/ несколько query-параметров:

  • skip (int) — сколько записей пропустить (для пагинации).
  • limit (int) — сколько записей вернуть (для пагинации).
  • category_id (Optional[int]) — фильтрация по категории.
  • location (Optional[str]) — фильтрация по содержанию текста в поле location.
  • order_by (Optional[str]) — имя поля, по которому сортировать (например "lost_date" или "name").
  • sort_desc (bool) — сортировка по убыванию, если True; по умолчанию False (возрастание).

Таким образом, один эндпоинт покрывает все три задачи: пагинация, фильтрация и сортировка.

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

  1. Query-параметры:

    • skip и limit (пагинация): пропускаем skip записей и берём limit.
    • category_id и location (фильтрация): если пользователь указал — добавляем WHERE category_id = ... или WHERE location ILIKE '%...%'.
    • order_by и sort_desc (сортировка): собираем ORDER BY по нужному полю, и если sort_desc=True, делаем убывающий порядок (desc()).
  2. ilike(...)
    Делаем регистронезависимый поиск по локации. Это удобно для поиска текста, например "МосКвА" будет найдено, если в БД есть "Москва".

  3. Проверка поля сортировки

    • Если в order_by пользователь передал строку, например "lost_date", через getattr(models.LostItem, order_by, None) мы пытаемся получить атрибут модели. Если его нет, пропускаем сортировку.
    • Если атрибут есть, добавляем .order_by(column_attr.desc()) или .order_by(column_attr.asc()).
  4. Документация в Swagger

    • Query(...) с параметрами description=... сделает так, что в /docs (Swagger) эти параметры будут подробно отражены.

Теперь эндпоинт GET /lost_items/ можно вызвать, например, так:

GET /lost_items/?skip=5&limit=5&category_id=2&location=москва&order_by=lost_date&sort_desc=true

и вы получите следующие 5 записей (пропущено 5), из категории id=2, у которых в локации есть москва (регистронезависимо), отсортированные по lost_date убыванию.

commit: Урок 12: пагинация, фильтрация, сортировка в lost_items

commit: Урок 12 (ПРАКТИКА): пагинация, фильтрация, сортировка в found_items

Ниже — пример обновлённого routers/found_items.py, в котором добавлены такие же механизмы пагинации, фильтрации и сортировки, как и для lost_items. Мы используем следующие query-параметры:

  • skip (int, по умолчанию 0) — сколько записей пропустить.
  • limit (int, по умолчанию 10) — сколько записей вернуть.
  • category_id (Optional[int]) — если указано, фильтруем только найденные вещи в нужной категории.
  • location (Optional[str]) — если указано, ищем по содержанию текста в поле location (через ilike).
  • order_by (Optional[str]) — имя поля, по которому сортируем (например "found_date", "name").
  • sort_desc (bool) — если True, сортируем по убыванию; по умолчанию False (по возрастанию).

Все эти параметры необязательны (Optional), и благодаря этому один эндпоинт может охватить все сценарии: пагинация, фильтрация и/или сортировка.

Объяснения по коду

  1. Query-параметры:

    • skip (пагинация): сколько строк пропустить (по умолчанию 0).
    • limit (пагинация): сколько строк вернуть (по умолчанию 10).
    • category_id (фильтрация): если задано, добавляем WHERE category_id = ....
    • location (фильтрация): если задано, добавляем WHERE location ILIKE '%...%'.
    • order_by (сортировка): имя столбца (например, "found_date").
    • sort_desc (bool): True — убывание, False — возрастание.
  2. Логика запроса:

    1. Начинаем с query = select(models.FoundItem).
    2. Применяем WHERE-условия, если пользователь передал фильтрационные параметры.
    3. Если пользователь указал order_by, получаем атрибут у модели (getattr(models.FoundItem, order_by)) и устанавливаем order_by(... .desc()) или order_by(... .asc()).
    4. Применяем .offset(skip).limit(limit) для пагинации.
    5. Выполняем запрос (await db.execute(query)) и скаляризуем в Python-список (.scalars().all()).
  3. Документация в Swagger:

    • Благодаря Query(...) с description всё будет видимо в /docs.
  4. Примеры вызова:

    • /found_items/?limit=5&order_by=found_date&sort_desc=true
      Получаем 5 последних найденных (самые свежие вверху).
    • /found_items/?skip=10&limit=5&category_id=2&location=Арбат
      Пропускаем первые 10, затем берём 5 записей только из категории id=2, у которых в location есть «Арбат» (регистронезависимо).

Таким образом, ваш эндпоинт для found_items теперь аналогично поддерживает пагинацию, фильтрацию и сортировку.

commit: Урок 12 (РЕШЕНИЕ): пагинация, фильтрация, сортировка в found_items

Урок 13

Описание изменений:

  • Изменения в models.py:
    • Добавлена ассоциативная таблица lostitem_tag для связи между LostItem и Tag.
    • Создана новая модель Tag, представляющая теги, которые могут быть привязаны к потерянным предметам.
    • В модель Tag добавлено поле lost_items, которое устанавливает связь с моделью LostItem через ассоциативную таблицу lostitem_tag.
    • В модель LostItem будет добавлено поле tags для обратной связи с тегами (необходимо будет внести изменения в LostItem для завершения этой связи).

Зачем нужны эти изменения:

  • Введение тегов позволяет более гибко классифицировать потерянные предметы, добавляя возможность привязывать несколько тегов к одному предмету.

  • Это улучшает фильтрацию и поиск потерянных предметов, делая систему более удобной для пользователей.

  • Ассоциативная таблица lostitem_tag обеспечивает правильную организацию связей "многие ко многим" между потерянными предметами и тегами.

  • создание файла миграции: alembic revision --autogenerate -m "add Tag table and lostitem_tag association"

  • применение миграции: alembic upgrade head

commit: Урок 13: добавление тегов для потерянных предметов

  1. Изменения в routers/lost_items.py:

    • Добавлен импорт selectinload из sqlalchemy.orm для загрузки связанных данных.
    • В маршруте read_lost_items добавлена опция selectinload для загрузки связанных тегов (tags) вместе с потерянными предметами.
    • Это позволяет загружать теги в один запрос, улучшая производительность при чтении данных.
  2. Изменения в schemas.py:

    • Добавлены новые схемы для работы с тегами: TagBase, TagCreate, TagUpdate, и TagRead.
    • В схему LostItem добавлено поле tags, которое возвращает список тегов, связанных с потерянным предметом.
    • Эти изменения обеспечивают валидацию и сериализацию данных тегов, а также их возврат при запросах на получение потерянных предметов.

Зачем нужны эти изменения:

  • Введение тегов для потерянных предметов позволяет более гибко классифицировать предметы, добавляя возможность привязывать несколько тегов к одному предмету.
  • Использование selectinload улучшает производительность при загрузке связанных данных, уменьшая количество запросов к базе данных.
  • Новые схемы для тегов обеспечивают согласованность и валидацию данных на уровне API.

Дополнительная информация:

  • По умолчанию SQLAlchemy делает «ленивую» загрузку M:N связей (lazy load). При сериализации ответа LostItem может не подтянуться список tags (или подтянется в отдельном запросе только при обращении к item.tags, что в асинхронном контексте FastAPI может вернуть пустой список, если не вызвать вручную).
  • selectinload или joinedload заставляют SQLAlchemy «жадно» (eager) загрузить связанные объекты:
    • selectinload сделает несколько запросов по принципу SELECT ... WHERE lost_item_id IN (...).
    • joinedload сделает один большой JOIN (если нужно вернуть теги в одном запросе).
  • Схема LostItem содержит поле tags: list[TagRead], поэтому, когда вы возвращаете items, Pydantic умеет подтянуть и сериализовать эти теги в JSON.

commit: Урок 13: обновление схем и эндпоинта read_lost_items

  1. Добавлен новый маршрутизатор routers/tags.py:

    • Реализованы CRUD-операции для тегов:
      • POST /tags — создание нового тега (с проверкой на уникальность).
      • GET /tags — получение списка всех тегов.
      • GET /tags/{tag_id} — получение конкретного тега по ID.
      • PUT /tags/{tag_id} — обновление имени тега (с проверкой на дублирование).
      • DELETE /tags/{tag_id} — удаление тега.
    • Эти маршруты позволяют управлять тегами независимо от их использования в LostItem или FoundItem.
  2. Обновления в main.py:

    • Подключён новый роутер tags_router с префиксом /tags.
    • Теперь API поддерживает работу с тегами на отдельном эндпоинте.
  3. Изменения в schemas.py:

    • Добавлены новые схемы:
      • TagBase — базовая схема для тегов.
      • TagCreate — схема для создания тегов.
      • TagRead — схема для возврата данных о теге.
    • Эти схемы обеспечивают валидацию и сериализацию данных тегов.

Зачем нужны эти изменения:

  • Позволяют управлять тегами отдельно от объектов LostItem и FoundItem.
  • Добавляют API-интерфейс для создания, редактирования и удаления тегов.
  • Гарантируют, что теги имеют уникальные имена, исключая дублирование.
  • Обеспечивают правильную сериализацию данных тегов при их возврате.

Дополнительная информация:

  • Валидация TagCreate гарантирует, что тег нельзя создать, если он уже есть в базе.
  • При обновлении имени тега API проверяет, чтобы новое имя не совпадало с уже существующими тегами.
  • SQLAlchemy автоматически удаляет привязки тегов в lostitem_tag при удалении самого тега.

commit: Урок 13: добавление CRUD-эндпоинтов для тегов

  1. Изменение в маршрутах привязки тегов (attach_tag_to_lost_item)

    • Вместо db.get(...) используем select(...).options(selectinload(...)) для явной загрузки списка тегов.
    • Устранили ошибку MissingGreenlet, возникавшую при ленивой загрузке (lazy load) в асинхронном режиме.
  2. Изменение в маршрутах отвязки тегов (detach_tag_from_lost_item)

    • Аналогично используем selectinload(LostItem.tags) перед проверкой if tag in lost_item.tags:.
    • Это позволяет избежать повторного ленивого запроса к базе, который приводил к конфликту event loop и ошибке MissingGreenlet.

Зачем нужны эти изменения:

  • В асинхронном режиме SQLAlchemy «лениво» подгружает связанные данные при первом обращении к lost_item.tags. Это иногда выпадает из event loop и вызывает MissingGreenlet.
  • Использование selectinload заранее загружает теги одним дополнительным запросом в момент получения LostItem, так что при проверке if tag in lost_item.tags: не происходит повторного запроса «вручную».
  • В результате, привязка и отвязка тегов в асинхронном FastAPI теперь работает корректно и не выбрасывает исключений, связанных с «зелёными нитями» (greenlets).

Дополнительная информация:

  • В асинхронном FastAPI стоит избегать «ленивой» загрузки M:N (lazy load), которая внутри может вызывать I/O вне нужного greenlet.
  • selectinload(LostItem.tags) или joinedload(LostItem.tags) решает проблему, обеспечивая «жадную» загрузку данных до обращения к полю .tags.
  • Если в будущем понадобится аналогичная логика для FoundItem, следует применять тот же подход.

commit: Урок 13: привязка/отвязка тегов (selectinload) для LostItem

Зачем нужны эти изменения:

  • Готовим Many-to-Many связь FoundItem <-> Tag.
  • Позволяет хранить, какие теги привязаны к найденным предметам.

Доп. информация:

  • Это аналогично lostitem_tag, но теперь для FoundItem.

  • создание файла миграции: alembic revision --autogenerate -m "add Tag table and founditem_tag association"

  • применение миграции: alembic upgrade head

commit: Урок 13 (РЕШЕНИЕ): добавление тегов для найденных предметов

Зачем нужны эти изменения:

  • Пользователи теперь могут создавать/получать/редактировать объекты FoundItem, и видеть/редактировать список тегов (в будущем шаге).

Доп. информация:

  • Если CRUD для FoundItem уже был, мы просто дорабатываем схему и добавляем selectinload для тегов.

commit: Урок 13 (РЕШЕНИЕ): обновление схем и эндпоинта для найденных предметов

Зачем нужны эти изменения:

  • Дают пользователям возможность динамически привязывать и отвязывать теги у FoundItem.
  • Завершают реализацию Many-to-Many для FoundItem.

Доп. информация:

  • Избегаем MissingGreenlet, так как мы не полагаемся на ленивую загрузку при обращении found_item.tags.
  • Теперь FoundItem полностью аналогичен LostItem по работе с тегами.

commit: Урок 13 (РЕШЕНИЕ): привязка/отвязка тегов (selectinload) для FoundItem

Описание изменений:

  1. Изменения в database.py:
    • Удалены ненужные импорты FastAPI, Depends, HTTPException, и List, так как они не используются в этом файле.
    • Добавлены параметры конфигурации для создания асинхронного движка SQLAlchemy:
      • pool_size: Устанавливает количество соединений, которые будут поддерживаться открытыми.
      • max_overflow: Определяет количество дополнительных соединений, которые могут быть открыты при пиковой нагрузке.
      • pool_timeout: Устанавливает время ожидания освобождения соединения.
      • pool_recycle: Определяет время жизни одного соединения.
      • echo: Опциональный параметр для логирования SQL-запросов (в данном случае отключен).
    • Обновлено создание фабрики сессий AsyncSessionLocal с использованием параметра bind, что позволяет более гибко управлять подключениями.

Зачем нужны эти изменения:

  • Настройка пула соединений позволяет более эффективно управлять ресурсами базы данных, особенно при высоких нагрузках.
  • Параметры пула соединений помогают избежать утечек соединений и обеспечивают стабильную работу приложения.
  • Удаление ненужных импортов улучшает читаемость и поддержку кода.

commit: Урок 13: настройка пула соединений для базы данных

Урок 14

Описание изменений:

  1. Изменения в models.py:
    • Добавлена новая модель User, представляющая пользователей системы.
    • Модель User содержит следующие поля:
      • id: Уникальный идентификатор пользователя.
      • username: Уникальное имя пользователя, которое используется для аутентификации.
      • hashed_password: Хэшированный пароль пользователя для безопасного хранения.

Зачем нужны эти изменения:

  • Введение модели User позволяет реализовать систему аутентификации и авторизации в приложении.

  • Хранение хэшированных паролей обеспечивает безопасность данных пользователей.

  • Уникальное имя пользователя гарантирует, что каждый пользователь может быть однозначно идентифицирован в системе.

  • создание файла миграции: alembic revision --autogenerate -m "create users table"

  • применение миграции: alembic upgrade head

commit: Урок 14: добавление модели пользователя

Описание изменений:

  1. Изменения в schemas.py:
    • Добавлены новые схемы для работы с пользователями: UserCreate и UserRead.
    • Схема UserCreate используется для создания нового пользователя и включает поля:
      • username: Имя пользователя.
      • password: Пароль пользователя (в реальной системе пароль должен быть захэширован перед сохранением).
    • Схема UserRead используется для возврата данных о пользователе и включает поля:
      • id: Уникальный идентификатор пользователя.
      • username: Имя пользователя.
    • Обе схемы используют конфигурацию from_attributes = True, что позволяет Pydantic автоматически заполнять модели данными из ORM-объектов.

Зачем нужны эти изменения:

  • Введение схем для пользователей позволяет валидировать данные при создании новых пользователей и сериализовать данные пользователей при их возврате через API.
  • Эти схемы обеспечивают согласованность и безопасность данных, гарантируя, что только необходимые поля возвращаются клиенту.
  • Использование from_attributes упрощает работу с ORM-объектами, автоматически преобразуя их в Pydantic-модели.

commit: Урок 14: добавление схем для пользователей

Описание изменений:

  1. Изменения в main.py:

    • Добавлен импорт маршрутизатора users_router из модуля routers.users.
    • Включен новый маршрут /users в приложение FastAPI, который обрабатывается маршрутизатором users_router.
    • Это позволяет приложению обрабатывать запросы, связанные с пользователями, через новый маршрут.
  2. Изменения в requirements.txt:

    • Добавлены новые зависимости:
      • bcrypt==4.0.1: Библиотека для хеширования паролей, что обеспечивает безопасное хранение паролей пользователей.
      • colorama==0.4.6: Библиотека для кросс-платформенной поддержки цветного вывода в терминале.
      • passlib==1.7.4: Библиотека для работы с паролями, включая их хеширование и проверку.

Зачем нужны эти изменения:

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

commit: Урок 14: добавление маршрутизатора для пользователей и зависимостей для работы с паролями

Описание изменений:

  1. Изменения в main.py:

    • Добавлен импорт маршрутизатора auth_router из модуля routers.auth.
    • Добавлен импорт oauth2_scheme из модуля utils.security, который используется для аутентификации с помощью OAuth2.
    • Включен новый маршрут /auth в приложение FastAPI, который обрабатывается маршрутизатором auth_router.
    • Это позволяет приложению обрабатывать запросы, связанные с аутентификацией пользователей.
  2. Изменения в requirements.txt:

    • Добавлены новые зависимости:
      • cffi==1.17.1: Библиотека для интерфейса C с Python.
      • cryptography==44.0.2: Библиотека для работы с криптографией, включая шифрование и дешифрование.
      • ecdsa==0.19.1: Библиотека для работы с цифровыми подписями.
      • pyasn1==0.4.8: Библиотека для работы с ASN.1.
      • pycparser==2.22: Парсер C для cffi.
      • python-jose==3.4.0: Библиотека для работы с JOSE (JWT).
      • python-multipart==0.0.20: Библиотека для работы с multipart/form-data.
      • rsa==4.9: Библиотека для работы с RSA.
      • six==1.17.0: Библиотека для обеспечения совместимости Python 2 и 3.
  3. Изменения в utils/security.py:

    • Добавлены функции для работы с JWT (JSON Web Tokens):
      • create_access_token: Создает JWT-токен с указанным сроком действия.
      • authenticate_user: Проверяет логин и пароль пользователя, возвращает объект пользователя при успешной аутентификации.
    • Добавлены константы для настройки JWT: SECRET_KEY, ALGORITHM, и ACCESS_TOKEN_EXPIRE_MINUTES.
    • Добавлены импорты для работы с JWT и асинхронными запросами к базе данных.
    • Добавлены импорты для работы с FastAPI и HTTP-авторизацией.
    • Добавлена функция get_current_user, которая извлекает и проверяет JWT-токен, получая текущего пользователя из базы данных.
    • Добавлена схема oauth2_scheme для использования в маршрутах FastAPI.

Зачем нужны эти изменения:

  • Введение маршрутизатора для аутентификации позволяет приложению обрабатывать запросы, связанные с аутентификацией пользователей, такие как вход в систему и получение токенов доступа.
  • Добавленные зависимости обеспечивают безопасность и функциональность, связанную с аутентификацией и работой с JWT.
  • Функции в security.py обеспечивают создание и проверку JWT-токенов, что является важной частью системы аутентификации.
  • Функция get_current_user упрощает процесс аутентификации, извлекая пользователя из JWT-токена и проверяя его подлинность.

commit: Урок 14: добавление маршрутизатора для аутентификации и функций для работы с JWT

Описание изменений:

  1. Изменения в routers/found_items.py:
    • Добавлены зависимости token и user в маршрут read_found_items для обеспечения защиты через JWT.
    • Теперь маршрут read_found_items доступен только авторизованным пользователям.
    • Упрощена логика сортировки, объединив условия в одну строку.

Зачем нужны эти изменения:

  • Упрощение логики сортировки делает код более читаемым и поддерживаемым.

commit: Урок 14: добавление защиты маршрутов с помощью JWT

Описание изменений:

  1. Изменения в routers/categories.py:

    • Добавлены зависимости token и user в маршруты create_category, update_category, и delete_category для обеспечения защиты через JWT.
    • Теперь маршруты доступны только авторизованным пользователям.
  2. Изменения в routers/found_items.py:

    • Добавлены зависимости token и user в маршруты create_found_item, attach_tag_to_found_item, detach_tag_from_found_item, read_found_item, update_found_item, и delete_found_item для обеспечения защиты через JWT.
    • Добавлено явное загрузка связанных данных (tags) через selectinload для маршрутов create_found_item, read_found_item, и update_found_item.
  3. Изменения в routers/lost_items.py:

    • Добавлены зависимости token и user в маршруты create_lost_item, attach_tag_to_lost_item, detach_tag_from_lost_item, read_lost_item, update_lost_item, и delete_lost_item для обеспечения защиты через JWT.
    • Добавлено явное загрузка связанных данных (tags) через selectinload для маршрутов create_lost_item, read_lost_item, и update_lost_item.
  4. Изменения в routers/tags.py:

    • Добавлены зависимости token и user в маршруты create_tag, read_tag_by_id, update_tag, и delete_tag для обеспечения защиты через JWT.

Зачем нужны эти изменения:

  • Введение защиты маршрутов с помощью JWT обеспечивает безопасность API, позволяя только авторизованным пользователям получать доступ к определенным ресурсам.
  • Использование selectinload для загрузки связанных данных улучшает производительность при чтении данных, уменьшая количество запросов к базе данных.
  • Обновление маршрутов для работы с категориями, найденными предметами, потерянными предметами и тегами обеспечивает согласованность и безопасность данных на уровне API.

commit: Урок 14 (РЕШЕНИЕ): добавление защиты маршрутов с помощью JWT

Урок 15

Описание изменений:

  1. Изменения в auth_service/alembic/versions/1d8eaa684b7d_create_users_table.py:

    • Исправлена опечатка в имени переменной revision на revision.
    • Удалено значение down_revision, так как оно не используется.
  2. Добавление auth_service/config.py:

    • Добавлен файл конфигурации для сервиса аутентификации.
    • Определены параметры подключения к базе данных и метод async_database_url для формирования URL подключения.
  3. Изменения в auth_service/main.py:

    • Удалены ненужные импорты и маршруты, связанные с lost_items, found_items, categories, и tags.
    • Обновлено приветственное сообщение для корневого маршрута.
  4. Изменения в auth_service/models.py:

    • Удалены модели и таблицы, связанные с LostItem, FoundItem, Category, и Tag, так как они больше не используются в сервисе аутентификации.
    • Оставлена только модель User.
  5. Изменения в auth_service/schemas.py:

    • Удалены схемы, связанные с LostItem, FoundItem, Category, и Tag.
    • Оставлена только схема UserCreate для создания пользователей.
  6. Изменения в docker-compose.yml:

    • Обновлены настройки для сервисов lostfound_service и auth_service.
    • Добавлены контейнеры для баз данных lostfound_db и auth_db.
    • Удалены устаревшие настройки и переменные окружения.
  7. Изменения в lost_found_service/routers/lost_items.py и lost_found_service/routers/tags.py:

    • Удалены зависимости token и user, связанные с аутентификацией, так как они больше не используются в этих маршрутах.

Зачем нужны эти изменения:

  • Удаление ненужных моделей, схем и маршрутов упрощает структуру проекта и улучшает его читаемость.
  • Обновление конфигурации Docker Compose обеспечивает правильную настройку и взаимодействие между микросервисами.
  • Исправление опечаток и удаление неиспользуемых переменных улучшает качество кода и предотвращает потенциальные ошибки.

commit: Урок 15: рефакторинг и оптимизация структуры микросервисов

Описание изменений:

  1. Изменения в auth_service/main.py:

    • Добавлены настройки FastAPI, такие как title, version, openapi_url, docs_url, redoc_url, и root_path.
    • Обновлено приветственное сообщение для корневого маршрута.
    • Удалены устаревшие импорты и переменные, которые больше не используются.
  2. Изменения в docker-compose.yml:

    • Добавлен сервис nginx для настройки обратного проксирования.
    • Обновлены настройки для сервисов lostfound_service и auth_service.
    • Удалены устаревшие настройки и переменные окружения.
  3. Изменения в lost_found_service/main.py:

    • Добавлены настройки FastAPI, такие как title, version, openapi_url, docs_url, redoc_url, и root_path.
    • Удалены устаревшие импорты и переменные, которые больше не используются.
  4. Добавление nginx.conf:

    • Добавлен конфигурационный файл nginx.conf для настройки Nginx.
    • Настроено проксирование запросов к сервисам auth_service и lostfound_service через порты 8003 и 8000 соответственно.
    • Настроен балансировщик нагрузки для распределения запросов между сервисами.

Зачем нужны эти изменения:

  • Настройка Nginx позволяет централизованно управлять маршрутизацией запросов, обеспечивая проксирование к соответствующим сервисам на основе пути запроса.
  • Использование Nginx улучшает производительность и безопасность приложения, обеспечивая балансировку нагрузки и защиту от атак.
  • Установка заголовков X-Forwarded-* позволяет сервисам получать информацию о первоначальном запросе, что важно для правильной обработки и логирования.
  • Добавление настроек FastAPI в auth_service и lost_found_service улучшает документацию API и обеспечивает корректную маршрутизацию запросов.
  • Удаление устаревших маршрутов и зависимостей упрощает код и улучшает его читаемость и поддержку.

commit: Урок 15: настройка Nginx и обновление конфигурации FastAPI

Урок 17

Описание изменений:

  1. Изменения в auth_service/main.py:

    • Добавлены настройки FastAPI, такие как title, version, openapi_url, docs_url, redoc_url, и root_path.
    • Обновлено приветственное сообщение для корневого маршрута.
    • Удалены устаревшие импорты и переменные, которые больше не используются.
  2. Изменения в docker-compose.yml:

    • Добавлен сервис nginx для настройки обратного проксирования.
    • Обновлены настройки для сервисов lostfound_service и auth_service.
    • Удалены устаревшие настройки и переменные окружения.
  3. Изменения в lost_found_service/main.py:

    • Добавлены настройки FastAPI, такие как title, version, openapi_url, docs_url, redoc_url, и root_path.
    • Удалены устаревшие импорты и переменные, которые больше не используются.
  4. Добавление nginx.conf:

    • Добавлен конфигурационный файл nginx.conf для настройки Nginx.
    • Настроено проксирование запросов к сервисам auth_service и lostfound_service через порты 8003 и 8000 соответственно.
    • Настроен балансировщик нагрузки для распределения запросов между сервисами.
  5. Изменения в auth_service/routers/auth.py:

    • Добавлен маршрут /verify для проверки JWT-токена.
    • Обновлены импорты и зависимости для работы с JWT и асинхронными запросами.
  6. Изменения в auth_service/schemas.py:

    • Добавлена модель TokenData для данных пользователя в JWT.
  7. Изменения в auth_service/utils/security.py:

    • Добавлена функция verify_token для проверки JWT-токена и возврата данных пользователя.
    • Обновлены импорты и зависимости для работы с JWT и асинхронными запросами.
  8. Изменения в lost_found_service/routers/found_items.py и lost_found_service/routers/lost_items.py:

    • Удалены зависимости token и user, связанные с аутентификацией, так как они больше не используются в этих маршрутах.
    • Добавлена зависимость token_data для получения данных пользователя из JWT-токена.
  9. Изменения в lost_found_service/schemas.py:

    • Добавлена модель TokenData для данных пользователя в JWT.
  10. Изменения в lost_found_service/utils/security.py:

    • Добавлена функция get_token_data для получения данных пользователя из JWT-токена.

Зачем нужны эти изменения:

  • Настройка Nginx позволяет централизованно управлять маршрутизацией запросов, обеспечивая проксирование к соответствующим сервисам на основе пути запроса.
  • Использование Nginx улучшает производительность и безопасность приложения, обеспечивая балансировку нагрузки и защиту от атак.
  • Установка заголовков X-Forwarded-* позволяет сервисам получать информацию о первоначальном запросе, что важно для правильной обработки и логирования.
  • Добавление настроек FastAPI в auth_service и lost_found_service улучшает документацию API и обеспечивает корректную маршрутизацию запросов.
  • Удаление устаревших маршрутов и зависимостей упрощает код и улучшает его читаемость и поддержку.
  • Введение проверки JWT-токена через Nginx обеспечивает безопасность API, позволяя только авторизованным пользователям получать доступ к определенным ресурсам.

commit: Урок 17: настройка Nginx и обновление конфигурации FastAPI

Описание изменений:

  1. Изменения в auth_service/main.py:

    • Удален параметр root_path, чтобы упростить конфигурацию и избежать путаницы с маршрутизацией.
  2. Изменения в docker-compose.yml:

    • Добавлен сервис rabbitmq для управления очередями сообщений.
    • Обновлены зависимости для сервисов lostfound_service и auth_service, чтобы включить rabbitmq.
    • Удалены устаревшие настройки и переменные окружения.
  3. Изменения в auction_service/main.py:

    • Добавлены настройки для работы с RabbitMQ через faststream.rabbit.fastapi.
    • Добавлены примеры подписчиков и издателей сообщений.
  4. Изменения в auction_service/routers/auctions.py:

    • Удалены ненужные импорты и переменные окружения.
    • Обновлен URL для взаимодействия с lostfound_service.
  5. Изменения в lost_found_service/routers/found_items.py и lost_found_service/routers/lost_items.py:

    • Удалены зависимости token_data, так как они больше не используются в этих маршрутах.

Зачем нужны эти изменения:

  • Добавление RabbitMQ позволяет организовать асинхронную обработку сообщений и улучшить взаимодействие между микросервисами.
  • Упрощение конфигурации FastAPI и удаление устаревших настроек делает код более читаемым и поддерживаемым.
  • Обновление URL и зависимостей обеспечивает корректную работу микросервисов и их взаимодействие друг с другом.

commit: Урок 18: интеграция RabbitMQ и оптимизация конфигурации FastAPI

commit: Урок 18 (FIX): интеграция RabbitMQ и оптимизация конфигурации FastAPI

commit: Урок 18 (FIX2): интеграция RabbitMQ и оптимизация конфигурации FastAPI

commit: Урок 18 (FIX3): интеграция RabbitMQ и оптимизация конфигурации FastAPI

Описание изменений:

  1. Изменения в auction_service/docker-entrypoint.sh:

    • Добавлено ожидание готовности RabbitMQ перед запуском миграций и стартом сервиса.
  2. Изменения в docker-compose.yml:

    • Добавлены переменные окружения RABBITMQ_HOST и RABBITMQ_PORT для сервисов, чтобы обеспечить взаимодействие с RabbitMQ.
  3. Изменения в lost_found_service/docker-entrypoint.sh:

    • Добавлено ожидание готовности RabbitMQ перед запуском миграций и стартом сервиса.

Зачем нужны эти изменения:

  • Ожидание готовности RabbitMQ перед запуском сервисов обеспечивает корректную работу системы и предотвращает ошибки, связанные с недоступностью брокера сообщений.
  • Упрощение кода и удаление ненужных зависимостей делает систему более читаемой и поддерживаемой.
  • Добавление переменных окружения для RabbitMQ в docker-compose.yml обеспечивает централизованное управление конфигурацией и упрощает настройку взаимодействия между сервисами.

commit: Урок 18: интеграция RabbitMQ и оптимизация конфигурации FastAPI

Описание изменений:

  1. Изменения в lost_found_service/requirements.txt:

    • Добавлен пакет openai для интеграции с ChatGPT.
  2. Изменения в lost_found_service/routers/lost_items.py:

    • Добавлен новый маршрут /lost_items/{lost_item_id}/similar_found_items, который использует ChatGPT для поиска похожих найденных предметов.
    • Добавлена функция chatgpt_similarity для вызова ChatGPT и получения оценки сходства между текстами.
    • Обновлены импорты и зависимости для работы с ChatGPT.

Зачем нужны эти изменения:

  • Интеграция с ChatGPT позволяет использовать мощные возможности обработки естественного языка для поиска похожих предметов, что улучшает функциональность приложения.
  • Новый маршрут предоставляет пользователям возможность находить похожие найденные предметы на основе описания потерянного предмета, что улучшает пользовательский опыт.
  • Добавление пакета openai в requirements.txt обеспечивает корректную работу интеграции с ChatGPT.

commit: Урок 19: интеграция с ChatGPT для поиска похожих найденных предметов

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors