8000 GitHub - b4tman/stepik_storeapi: решение задачи "API магазина" для курса "Python-разработчик" на stepik
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

b4tman/stepik_storeapi

Repository files navigation

stepik_storeapi

Решение задачи "API магазина" для курса "Python-разработчик" на степике

А это мой профиль.

Буду благодарен за фидбек в Issues или Discussions.

Задача

Теперь ваша очередь написать свою API – часть онлайн магазина.

Ваша задача – сделать API, которая позволит клиентам:

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

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

У вас также есть две дополнительные роли – менеджер и админ.

Менеджер может менять товарам цену и описание.

Администратор может всё, что может менеджер, а также добавлять товары на платформу.

Для администраторов и менеджеров обязательно нужно проводить аутентификацию и авторизацию.

Удачи в выполнении!

В качестве ответа на задачу прикладывайте ссылку на GitHub.

Пример решения похожей задачи из курса: gardiys/stepik_blog.

Замечания по реализации

Основные условности

Вместо логина (имени пользователя) тут используется email.

В этой реализации корзин несколько, разделение идёт по email, но без аутентификации. По идее нужно хранить корзину в сессии, но пока без неё.

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

Начальные данные

Для простоты тестирования, в этой реализации при создании базы, кроме таблиц в базу добавляются предлопределённые данные (пользователи, товары, корзины) из файла default.toml.

Данные загружаются в базу только если в ней нет таблицы users.

Чтобы не загружать данные в базу при создании, нужно установить переменную окружения DATABASE_INIT_DATA в false.

Упрощения для Swagger UI

Для того чтобы данные в 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

Через 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 документации:

About

решение задачи "API магазина" для курса "Python-разработчик" на stepik

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0