Решение задачи "API магазина" для курса "Python-разработчик" на степике
А это мой профиль.
Буду благодарен за фидбек в Issues или Discussions.
Теперь ваша очередь написать свою API – часть онлайн магазина.
Ваша задача – сделать API, которая позволит клиентам:
- Получить список уникальных товаров – каждый товар в единичном экземпляре, у него есть описание, название и цена.
- Добавить товар в корзину
- Удалить товар из корзины
- Оформить заказ. Чтобы это сделать пользователю достаточно указать свою почту.
Все эндпоинты для клиентов должны работать без аутентификации.
У вас также есть две дополнительные роли – менеджер и админ.
Менеджер может менять товарам цену и описание.
Администратор может всё, что может менеджер, а также добавлять товары на платформу.
Для администраторов и менеджеров обязательно нужно проводить аутентификацию и авторизацию.
Удачи в выполнении!
В качестве ответа на задачу прикладывайте ссылку на GitHub.
Пример решения похожей задачи из курса: gardiys/stepik_blog.
Вместо логина (имени пользователя) тут используется email.
В этой реализации корзин несколько, разделение идёт по email, но без аутентификации. По идее нужно хранить корзину в сессии, но пока без неё.
Добавил хранение паролей в виде хеша, но по идее нужно аутентификацию вынести в отдельный модуль и использовать например OAuth токены, вместо передачи логина/пароля в каждый эндпоинт.
Для простоты тестирования, в этой реализации при создании базы, кроме таблиц в базу добавляются предлопределённые данные (пользователи, товары, корзины) из файла default.toml
.
Данные загружаются в базу только если в ней нет таблицы users
.
Чтобы не загружать данные в базу при создании, нужно установить переменную окружения DATABASE_INIT_DATA
в false
.
Для того чтобы данные в Swagger UI были в виде отдельных полей, а не в виде json текста в функциях эндпоинтов использована конструкция:
credentials: Annotated[LoginModel, Depends()]
вместо например
credentials: Annotated[LoginModel, Body()]
Это упрощает тестирование в Swagger UI, но в этом случае данные передаются как query параметры, например /items?name=123&description=123&price=123&email=123&password=123
, что плохо для реального использования.
Через docker-compose:
docker compose up
Для запуска на локальном ПК, создайте виртуальное окружение (если нет):
pip install --user virtualenv
virtualenv .venv
Активируйте его:
. .venv/bin/activate
Установите зависимости:
pip install -r requirements.txt
Запустите напрямую:
python src/store/main.py
Или используйте uvicorn с параметрами ниже:
uvicorn store.main:app --reload --port 8080 --app-dir src/
Установите зависимости для разработки:
pip install -r requirements.dev.txt
Запустите pytest:
pytest -v
Её необходимо собрать с помошью mkdocs. Для этого нужно установить зависимости:
pip install -r requirements.txt
pip install -r requirements.docs.txt
После этого либо собрать документацию в каталог site/
, либо запустить тестовый сервер.
# сборка
mkdocs build
# тестовый сервер
mkdocs serve
Стандартные локальные URL документации:
- Документация mkdocs: http://127.0.0.1:8000/
- Документация Swagger: http://127.0.0.1:8080/docs