- Создайте виртуальное окружение
- Установите зависимости из файла requirements.txt
- Создайте файл .env.local, используя .env.local.examples
- Создайте DB, используя параметры из .env.local
- Примените миграции
alembic upgrade head
- Запустите сервер
uvicorn main:app --reload
- Создайте тестовую DB, используя параметры из .env.local
- Запустите автотесты
pytest -v
- добавили зависимости в
requirements.txt - создали
.gitignore
commit: Урок 10: init
-
main.py:- Этот файл является точкой входа в ваше FastAPI приложение.
- Он инициализирует приложение FastAPI и подключает маршрутизаторы (
routers) для обработки запросов, связанных с потерянными и найденными предметами. - Содержит базовый эндпоинт
/, который возвращает приветственное сообщение.
-
config.py:- Содержит настройки приложения, такие как параметры подключения к базе данных.
- Использует Pydantic для валидации и загрузки переменных окружения из файла
.env.local.
-
.env.local.example:- Пример файла переменных окружения, который используется для настройки параметров базы данных и других конфигураций.
- Пользователи должны создать файл
.env.localна основе этого примера и заполнить его своими данными.
-
database.py:- Настраивает подключение к базе данных с использованием SQLAlchemy.
- Создает асинхронный движок и сессию для взаимодействия с базой данных.
-
models.py:- Определяет модели данных для таблиц
lost_itemsиfound_items. - Использует SQLAlchemy ORM для определения структуры таблиц и их полей.
- Каждая модель соответствует таблице в базе данных и определяет поля, такие как
id,name,description,date, иlocation.
- Определяет модели данных для таблиц
routers/lost_items.pyиrouters/found_items.py:- Определяют маршрутизаторы для обработки HTTP-запросов, связанных с потерянными и найденными предметами.
- Каждый маршрутизатор содержит CRUD (Create, Read, Update, Delete) операции для соответствующих моделей.
- Используют Pydantic схемы для валидации входных данных и сериализации ответов.
schemas.py:- Определяет Pydantic схемы для валидации данных, поступающих в API, и для сериализации данных, возвращаемых из API.
- Содержит схемы для создания, обновления и чтения потерянных и найденных предметов.
-
conftest.py:- Содержит фикстуры для настройки тестовой базы данных и клиента FastAPI.
- Использует
pytestиpytest-asyncioдля асинхронного тестирования. - Фикстуры обеспечивают изоляцию тестов, создавая и уничтожая тестовую базу данных перед и после выполнения тестов.
-
test_found_items.pyиtest_lost_items.py:- Содержат тесты для проверки функциональности эндпоинтов, связанных с найденными и потерянными предметами.
- Включают тесты для создания, чтения, обновления и удаления предметов, а также проверки на корректность обработки ошибок (например, когда предмет не найден).
-
alembic.iniиalembic/env.py:- Конфигурационные файлы для Alembic, инструмента для управления миграциями базы данных.
alembic.iniсодержит основные настройки, такие как путь к скриптам миграций.env.pyнастраивает окружение для выполнения миграций, подключаясь к базе данных и используя метаданные моделей.
-
789953bf9c87_init_migrations.py:- Автоматически сгенерированная миграция, которая создает таблицы
found_itemsиlost_itemsв базе данных. - Содержит команды для создания и удаления таблиц и индексов.
- Автоматически сгенерированная миграция, которая создает таблицы
commit: Урок 10: создан простой FastAPI проект
-
Обновление README.md:
- Добавлен новый раздел "Урок 11", который описывает команды для создания и применения миграции, добавляющей категории к потерянным предметам.
- Указаны команды
alembic revision --autogenerate -m "add category to lost items"иalembic upgrade headдля генерации и применения миграции.
-
Изменения в models.py:
- Добавлена новая модель
Category, представляющая категории, к которым могут относиться потерянные предметы. - В модель
LostItemдобавлены поляcategory_idиcategory, которые устанавливают связь с модельюCategory. - Используется
relationshipдля установки двусторонней связи междуLostItemиCategory.
- Добавлена новая модель
-
Изменения в routers/lost_items.py:
- В маршруте создания потерянного предмета добавлена проверка существования категории по
category_id. - Если категория не найдена, возвращается ошибка
404 Not Found.
- В маршруте создания потерянного предмета добавлена проверка существования категории по
-
Изменения в 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: добавлены категории к потерянным предметам
- Изменения в 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 (ПРАКТИКА): добавлены категории к найденным предметам
-
Обновление main.py:
- Добавлен новый маршрутизатор
categories_routerдля обработки запросов, связанных с категориями. - Подключен маршрутизатор к основному приложению FastAPI с префиксом
/categoriesи тегом["categories"].
- Добавлен новый маршрутизатор
-
Изменения в routers/found_items.py:
- В маршруте создания найденного предмета добавлена проверка существования категории по
category_id. - Если категория не найдена, возвращается ошибка
404 Not Found.
- В маршруте создания найденного предмета добавлена проверка существования категории по
-
Изменения в schemas.py:
- В схему
FoundItemBaseдобавлено полеcategory_idдля валидации данных, связанных с категорией. - Это позволяет убедиться, что при создании найденного предмета указывается существующая категория.
- В схему
Зачем нужны эти изменения:
- Введение маршрутизатора для категорий позволяет управлять категориями через API, добавляя, обновляя и удаляя их.
- Проверка существования категории при создании найденного предмета предотвращает ошибки, связанные с несуществующими категориями.
- Обновление схемы для найденных предметов обеспечивает согласованность и валидацию данных на уровне API.
commit: Урок 11 (ПРАКТИКА): добавлены маршрутизаторы для категорий и связаны найденные предметы с категориями
commit: Урок 11 (FIX): хотфикс, настройки подключения к БД
- создание файла миграции:
alembic revision --autogenerate -m "add category to found items" - после этого нужно внести изменения в новый файл миграций в разделах
upgradeиdowngradeдля того чтобы можно было накатить миграции на непустую базу. - после внесения изменений в файл миграции, применить миграцию:
alembic upgrade head
commit: Урок 12: добавлены данные в БД
session = AsyncSessionLocal()
Создаём асинхронную сессию, чтобы иметь доступ к базе данных через SQLAlchemy.await session.execute(query)
Выполняем асинхронный SQL-запрос (т.к. находимся внутриasync def main():). Если бы это был чисто синхронный контекст, обернули бы вasyncio.run(...). Но здесь у нас всё вasync def.select(...)— построение SQL-запроса..offset(N).limit(M)— пагинация (пропускаем N, берём M)..where(условие)— фильтрация..order_by(...)— сортировка.
.scalars().all()
Преобразует результат (курсор) в обычный Python-список объектов (LostItem / FoundItem).print(...)
Выводим на экран результаты, чтобы убедиться, что запрос возвращает нужные записи.
- Сохраните этот код в файл, например
test_db.py. - В терминале/консоли выполните:
python test_db.py
- Скрипт последовательно покажет:
- Пагинацию (две «страницы»).
- Фильтрацию (три разных условия).
- Сортировку (три разных способа).
При таком подходе весь код выполняется внутри одного 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(возрастание).
Таким образом, один эндпоинт покрывает все три задачи: пагинация, фильтрация и сортировка.
-
Query-параметры:
skipиlimit(пагинация): пропускаемskipзаписей и берёмlimit.category_idиlocation(фильтрация): если пользователь указал — добавляемWHERE category_id = ...илиWHERE location ILIKE '%...%'.order_byиsort_desc(сортировка): собираемORDER BYпо нужному полю, и еслиsort_desc=True, делаем убывающий порядок (desc()).
-
ilike(...)
Делаем регистронезависимый поиск по локации. Это удобно для поиска текста, например"МосКвА"будет найдено, если в БД есть"Москва". -
Проверка поля сортировки
- Если в
order_byпользователь передал строку, например"lost_date", черезgetattr(models.LostItem, order_by, None)мы пытаемся получить атрибут модели. Если его нет, пропускаем сортировку. - Если атрибут есть, добавляем
.order_by(column_attr.desc())или.order_by(column_attr.asc()).
- Если в
-
Документация в 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), и благодаря этому один эндпоинт может охватить все сценарии: пагинация, фильтрация и/или сортировка.
-
Query-параметры:
skip(пагинация): сколько строк пропустить (по умолчанию 0).limit(пагинация): сколько строк вернуть (по умолчанию 10).category_id(фильтрация): если задано, добавляемWHERE category_id = ....location(фильтрация): если задано, добавляемWHERE location ILIKE '%...%'.order_by(сортировка): имя столбца (например,"found_date").sort_desc(bool):True— убывание,False— возрастание.
-
Логика запроса:
- Начинаем с
query = select(models.FoundItem). - Применяем
WHERE-условия, если пользователь передал фильтрационные параметры. - Если пользователь указал
order_by, получаем атрибут у модели (getattr(models.FoundItem, order_by)) и устанавливаемorder_by(... .desc())илиorder_by(... .asc()). - Применяем
.offset(skip).limit(limit)для пагинации. - Выполняем запрос (
await db.execute(query)) и скаляризуем в Python-список (.scalars().all()).
- Начинаем с
-
Документация в Swagger:
- Благодаря
Query(...)сdescriptionвсё будет видимо в/docs.
- Благодаря
-
Примеры вызова:
/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
Описание изменений:
- Изменения в 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: добавление тегов для потерянных предметов
-
Изменения в routers/lost_items.py:
- Добавлен импорт
selectinloadизsqlalchemy.ormдля загрузки связанных данных. - В маршруте
read_lost_itemsдобавлена опцияselectinloadдля загрузки связанных тегов (tags) вместе с потерянными предметами. - Это позволяет загружать теги в один запрос, улучшая производительность при чтении данных.
- Добавлен импорт
-
Изменения в 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
-
Добавлен новый маршрутизатор
routers/tags.py:- Реализованы CRUD-операции для тегов:
POST /tags— создание нового тега (с проверкой на уникальность).GET /tags— получение списка всех тегов.GET /tags/{tag_id}— получение конкретного тега по ID.PUT /tags/{tag_id}— обновление имени тега (с проверкой на дублирование).DELETE /tags/{tag_id}— удаление тега.
- Эти маршруты позволяют управлять тегами независимо от их использования в
LostItemилиFoundItem.
- Реализованы CRUD-операции для тегов:
-
Обновления в
main.py:- Подключён новый роутер
tags_routerс префиксом/tags. - Теперь API поддерживает работу с тегами на отдельном эндпоинте.
- Подключён новый роутер
-
Изменения в
schemas.py:- Добавлены новые схемы:
TagBase— базовая схема для тегов.TagCreate— схема для создания тегов.TagRead— схема для возврата данных о теге.
- Эти схемы обеспечивают валидацию и сериализацию данных тегов.
- Добавлены новые схемы:
Зачем нужны эти изменения:
- Позволяют управлять тегами отдельно от объектов
LostItemиFoundItem. - Добавляют API-интерфейс для создания, редактирования и удаления тегов.
- Гарантируют, что теги имеют уникальные имена, исключая дублирование.
- Обеспечивают правильную сериализацию данных тегов при их возврате.
Дополнительная информация:
- Валидация
TagCreateгарантирует, что тег нельзя создать, если он уже есть в базе. - При обновлении имени тега API проверяет, чтобы новое имя не совпадало с уже существующими тегами.
- SQLAlchemy автоматически удаляет привязки тегов в
lostitem_tagпри удалении самого тега.
commit: Урок 13: добавление CRUD-эндпоинтов для тегов
-
Изменение в маршрутах привязки тегов (
attach_tag_to_lost_item)- Вместо
db.get(...)используемselect(...).options(selectinload(...))для явной загрузки списка тегов. - Устранили ошибку
MissingGreenlet, возникавшую при ленивой загрузке (lazy load) в асинхронном режиме.
- Вместо
-
Изменение в маршрутах отвязки тегов (
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
Описание изменений:
- Изменения в database.py:
- Удалены ненужные импорты
FastAPI,Depends,HTTPException, иList, так как они не используются в этом файле. - Добавлены параметры конфигурации для создания асинхронного движка SQLAlchemy:
pool_size: Устанавливает количество соединений, которые будут поддерживаться открытыми.max_overflow: Определяет количество дополнительных соединений, которые могут быть открыты при пиковой нагрузке.pool_timeout: Устанавливает время ожидания освобождения соединения.pool_recycle: Определяет время жизни одного соединения.echo: Опциональный параметр для логирования SQL-запросов (в данном случае отключен).
- Обновлено создание фабрики сессий
AsyncSessionLocalс использованием параметраbind, что позволяет более гибко управлять подключениями.
- Удалены ненужные импорты
Зачем нужны эти изменения:
- Настройка пула соединений позволяет более эффективно управлять ресурсами базы данных, особенно при высоких нагрузках.
- Параметры пула соединений помогают избежать утечек соединений и обеспечивают стабильную работу приложения.
- Удаление ненужных импортов улучшает читаемость и поддержку кода.
commit: Урок 13: настройка пула соединений для базы данных
Описание изменений:
- Изменения в models.py:
- Добавлена новая модель
User, представляющая пользователей системы. - Модель
Userсодержит следующие поля:id: Уникальный идентификатор пользователя.username: Уникальное имя пользователя, которое используется для аутентификации.hashed_password: Хэшированный пароль пользователя для безопасного хранения.
- Добавлена новая модель
Зачем нужны эти изменения:
-
Введение модели
Userпозволяет реализовать систему аутентификации и авторизации в приложении. -
Хранение хэшированных паролей обеспечивает безопасность данных пользователей.
-
Уникальное имя пользователя гарантирует, что каждый пользователь может быть однозначно идентифицирован в системе.
-
создание файла миграции:
alembic revision --autogenerate -m "create users table" -
применение миграции:
alembic upgrade head
commit: Урок 14: добавление модели пользователя
Описание изменений:
- Изменения в schemas.py:
- Добавлены новые схемы для работы с пользователями:
UserCreateиUserRead. - Схема
UserCreateиспользуется для создания нового пользователя и включает поля:username: Имя пользователя.password: Пароль пользователя (в реальной системе пароль должен быть захэширован перед сохранением).
- Схема
UserReadиспользуется для возврата данных о пользователе и включает поля:id: Уникальный идентификатор пользователя.username: Имя пользователя.
- Обе схемы используют конфигурацию
from_attributes = True, что позволяет Pydantic автоматически заполнять модели данными из ORM-объектов.
- Добавлены новые схемы для работы с пользователями:
Зачем нужны эти изменения:
- Введение схем для пользователей позволяет валидировать данные при создании новых пользователей и сериализовать данные пользователей при их возврате через API.
- Эти схемы обеспечивают согласованность и безопасность данных, гарантируя, что только необходимые поля возвращаются клиенту.
- Использование
from_attributesупрощает работу с ORM-объектами, автоматически преобразуя их в Pydantic-модели.
commit: Урок 14: добавление схем для пользователей
Описание изменений:
-
Изменения в main.py:
- Добавлен импорт маршрутизатора
users_routerиз модуляrouters.users. - Включен новый маршрут
/usersв приложение FastAPI, который обрабатывается маршрутизаторомusers_router. - Это позволяет приложению обрабатывать запросы, связанные с пользователями, через новый маршрут.
- Добавлен импорт маршрутизатора
-
Изменения в requirements.txt:
- Добавлены новые зависимости:
bcrypt==4.0.1: Библиотека для хеширования паролей, что обеспечивает безопасное хранение паролей пользователей.colorama==0.4.6: Библиотека для кросс-платформенной поддержки цветного вывода в терминале.passlib==1.7.4: Библиотека для работы с паролями, включая их хеширование и проверку.
- Добавлены новые зависимости:
Зачем нужны эти изменения:
- Введение маршрутизатора для пользователей позволяет приложению обрабатывать запросы, связанные с управлением пользователями, такие как регистрация, аутентификация и управление профилем.
- Добавленные зависимости обеспечивают безопасность и функциональность, связанную с обработкой паролей, что является критически важным для системы управления пользователями.
commit: Урок 14: добавление маршрутизатора для пользователей и зависимостей для работы с паролями
Описание изменений:
-
Изменения в main.py:
- Добавлен импорт маршрутизатора
auth_routerиз модуляrouters.auth. - Добавлен импорт
oauth2_schemeиз модуляutils.security, который используется для аутентификации с помощью OAuth2. - Включен новый маршрут
/authв приложение FastAPI, который обрабатывается маршрутизаторомauth_router. - Это позволяет приложению обрабатывать запросы, связанные с аутентификацией пользователей.
- Добавлен импорт маршрутизатора
-
Изменения в 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.
- Добавлены новые зависимости:
-
Изменения в 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 (JSON Web Tokens):
Зачем нужны эти изменения:
- Введение маршрутизатора для аутентификации позволяет приложению обрабатывать запросы, связанные с аутентификацией пользователей, такие как вход в систему и получение токенов доступа.
- Добавленные зависимости обеспечивают безопасность и функциональность, связанную с аутентификацией и работой с JWT.
- Функции в
security.pyобеспечивают создание и проверку JWT-токенов, что является важной частью системы аутентификации. - Функция
get_current_userупрощает процесс аутентификации, извлекая пользователя из JWT-токена и проверяя его подлинность.
commit: Урок 14: добавление маршрутизатора для аутентификации и функций для работы с JWT
Описание изменений:
- Изменения в routers/found_items.py:
- Добавлены зависимости
tokenиuserв маршрутread_found_itemsдля обеспечения защиты через JWT. - Теперь маршрут
read_found_itemsдоступен только авторизованным пользователям. - Упрощена логика сортировки, объединив условия в одну строку.
- Добавлены зависимости
Зачем нужны эти изменения:
- Упрощение логики сортировки делает код более читаемым и поддерживаемым.
commit: Урок 14: добавление защиты маршрутов с помощью JWT
Описание изменений:
-
Изменения в routers/categories.py:
- Добавлены зависимости
tokenиuserв маршрутыcreate_category,update_category, иdelete_categoryдля обеспечения защиты через JWT. - Теперь маршруты доступны только авторизованным пользователям.
- Добавлены зависимости
-
Изменения в 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.
- Добавлены зависимости
-
Изменения в 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.
- Добавлены зависимости
-
Изменения в routers/tags.py:
- Добавлены зависимости
tokenиuserв маршрутыcreate_tag,read_tag_by_id,update_tag, иdelete_tagдля обеспечения защиты через JWT.
- Добавлены зависимости
Зачем нужны эти изменения:
- Введение защиты маршрутов с помощью JWT обеспечивает безопасность API, позволяя только авторизованным пользователям получать доступ к определенным ресурсам.
- Использование
selectinloadдля загрузки связанных данных улучшает производительность при чтении данных, уменьшая количество запросов к базе данных. - Обновление маршрутов для работы с категориями, найденными предметами, потерянными предметами и тегами обеспечивает согласованность и безопасность данных на уровне API.
commit: Урок 14 (РЕШЕНИЕ): добавление защиты маршрутов с помощью JWT
Описание изменений:
-
Изменения в
auth_service/alembic/versions/1d8eaa684b7d_create_users_table.py:- Исправлена опечатка в имени переменной
revisionнаrevision. - Удалено значение
down_revision, так как оно не используется.
- Исправлена опечатка в имени переменной
-
Добавление
auth_service/config.py:- Добавлен файл конфигурации для сервиса аутентификации.
- Определены параметры подключения к базе данных и метод
async_database_urlдля формирования URL подключения.
-
Изменения в
auth_service/main.py:- Удалены ненужные импорты и маршруты, связанные с
lost_items,found_items,categories, иtags. - Обновлено приветственное сообщение для корневого маршрута.
- Удалены ненужные импорты и маршруты, связанные с
-
Изменения в
auth_service/models.py:- Удалены модели и таблицы, связанные с
LostItem,FoundItem,Category, иTag, так как они больше не используются в сервисе аутентификации. - Оставлена только модель
User.
- Удалены модели и таблицы, связанные с
-
Изменения в
auth_service/schemas.py:- Удалены схемы, связанные с
LostItem,FoundItem,Category, иTag. - Оставлена только схема
UserCreateдля создания пользователей.
- Удалены схемы, связанные с
-
Изменения в
docker-compose.yml:- Обновлены настройки для сервисов
lostfound_serviceиauth_service. - Добавлены контейнеры для баз данных
lostfound_dbиauth_db. - Удалены устаревшие настройки и переменные окружения.
- Обновлены настройки для сервисов
-
Изменения в
lost_found_service/routers/lost_items.pyиlost_found_service/routers/tags.py:- Удалены зависимости
tokenиuser, связанные с аутентификацией, так как они больше не используются в этих маршрутах.
- Удалены зависимости
Зачем нужны эти изменения:
- Удаление ненужных моделей, схем и маршрутов упрощает структуру проекта и улучшает его читаемость.
- Обновление конфигурации Docker Compose обеспечивает правильную настройку и взаимодействие между микросервисами.
- Исправление опечаток и удаление неиспользуемых переменных улучшает качество кода и предотвращает потенциальные ошибки.
commit: Урок 15: рефакторинг и оптимизация структуры микросервисов
Описание изменений:
-
Изменения в
auth_service/main.py:- Добавлены настройки FastAPI, такие как
title,version,openapi_url,docs_url,redoc_url, иroot_path. - Обновлено приветственное сообщение для корневого маршрута.
- Удалены устаревшие импорты и переменные, которые больше не используются.
- Добавлены настройки FastAPI, такие как
-
Изменения в
docker-compose.yml:- Добавлен сервис
nginxдля настройки обратного проксирования. - Обновлены настройки для сервисов
lostfound_serviceиauth_service. - Удалены устаревшие настройки и переменные окружения.
- Добавлен сервис
-
Изменения в
lost_found_service/main.py:- Добавлены настройки FastAPI, такие как
title,version,openapi_url,docs_url,redoc_url, иroot_path. - Удалены устаревшие импорты и переменные, которые больше не используются.
- Добавлены настройки FastAPI, такие как
-
Добавление
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
Описание изменений:
-
Изменения в
auth_service/main.py:- Добавлены настройки FastAPI, такие как
title,version,openapi_url,docs_url,redoc_url, иroot_path. - Обновлено приветственное сообщение для корневого маршрута.
- Удалены устаревшие импорты и переменные, которые больше не используются.
- Добавлены настройки FastAPI, такие как
-
Изменения в
docker-compose.yml:- Добавлен сервис
nginxдля настройки обратного проксирования. - Обновлены настройки для сервисов
lostfound_serviceиauth_service. - Удалены устаревшие настройки и переменные окружения.
- Добавлен сервис
-
Изменения в
lost_found_service/main.py:- Добавлены настройки FastAPI, такие как
title,version,openapi_url,docs_url,redoc_url, иroot_path. - Удалены устаревшие импорты и переменные, которые больше не используются.
- Добавлены настройки FastAPI, такие как
-
Добавление
nginx.conf:- Добавлен конфигурационный файл
nginx.confдля настройки Nginx. - Настроено проксирование запросов к сервисам
auth_serviceиlostfound_serviceчерез порты 8003 и 8000 соответственно. - Настроен балансировщик нагрузки для распределения запросов между сервисами.
- Добавлен конфигурационный файл
-
Изменения в
auth_service/routers/auth.py:- Добавлен маршрут
/verifyдля проверки JWT-токена. - Обновлены импорты и зависимости для работы с JWT и асинхронными запросами.
- Добавлен маршрут
-
Изменения в
auth_service/schemas.py:- Добавлена модель
TokenDataдля данных пользователя в JWT.
- Добавлена модель
-
Изменения в
auth_service/utils/security.py:- Добавлена функция
verify_tokenдля проверки JWT-токена и возврата данных пользователя. - Обновлены импорты и зависимости для работы с JWT и асинхронными запросами.
- Добавлена функция
-
Изменения в
lost_found_service/routers/found_items.pyиlost_found_service/routers/lost_items.py:- Удалены зависимости
tokenиuser, связанные с аутентификацией, так как они больше не используются в этих маршрутах. - Добавлена зависимость
token_dataдля получения данных пользователя из JWT-токена.
- Удалены зависимости
-
Изменения в
lost_found_service/schemas.py:- Добавлена модель
TokenDataдля данных пользователя в JWT.
- Добавлена модель
-
Изменения в
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
Описание изменений:
-
Изменения в
auth_service/main.py:- Удален параметр
root_path, чтобы упростить конфигурацию и избежать путаницы с маршрутизацией.
- Удален параметр
-
Изменения в
docker-compose.yml:- Добавлен сервис
rabbitmqдля управления очередями сообщений. - Обновлены зависимости для сервисов
lostfound_serviceиauth_service, чтобы включитьrabbitmq. - Удалены устаревшие настройки и переменные окружения.
- Добавлен сервис
-
Изменения в
auction_service/main.py:- Добавлены настройки для работы с RabbitMQ через
faststream.rabbit.fastapi. - Добавлены примеры подписчиков и издателей сообщений.
- Добавлены настройки для работы с RabbitMQ через
-
Изменения в
auction_service/routers/auctions.py:- Удалены ненужные импорты и переменные окружения.
- Обновлен URL для взаимодействия с
lostfound_service.
-
Изменения в
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
Описание изменений:
-
Изменения в
auction_service/docker-entrypoint.sh:- Добавлено ожидание готовности RabbitMQ перед запуском миграций и стартом сервиса.
-
Изменения в
docker-compose.yml:- Добавлены переменные окружения
RABBITMQ_HOSTиRABBITMQ_PORTдля сервисов, чтобы обеспечить взаимодействие с RabbitMQ.
- Добавлены переменные окружения
-
Изменения в
lost_found_service/docker-entrypoint.sh:- Добавлено ожидание готовности RabbitMQ перед запуском миграций и стартом сервиса.
Зачем нужны эти изменения:
- Ожидание готовности RabbitMQ перед запуском сервисов обеспечивает корректную работу системы и предотвращает ошибки, связанные с недоступностью брокера сообщений.
- Упрощение кода и удаление ненужных зависимостей делает систему более читаемой и поддерживаемой.
- Добавление переменных окружения для RabbitMQ в
docker-compose.ymlобеспечивает централизованное управление конфигурацией и упрощает настройку взаимодействия между сервисами.
commit: Урок 18: интеграция RabbitMQ и оптимизация конфигурации FastAPI
Описание изменений:
-
Изменения в
lost_found_service/requirements.txt:- Добавлен пакет
openaiдля интеграции с ChatGPT.
- Добавлен пакет
-
Изменения в
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 для поиска похожих найденных предметов