Giter VIP home page Giter VIP logo

stepik_storeapi's Introduction

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

stepik_storeapi's People

Contributors

b4tman avatar

Stargazers

 avatar

Watchers

 avatar  avatar

stepik_storeapi's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.