Django REST API для сервиса закупок: пользователи регистрируются, подтверждают email, просматривают товары поставщиков, управляют корзиной, оформляют заказы, а поставщики обновляют прайс-листы и управляют приемом заказов.
- Python 3.13
- Django
- Django REST Framework
- Celery
- Redis
- SQLite
- PyYAML
- pytest
- Docker Compose
Создайте .env в корне проекта по примеру .env.example:
DEBUG=True
SECRET_KEY=change-me
ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0
DJANGO_SETTINGS_MODULE=config.settings
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0
EMAIL_BACKEND=orders.email_backends.ReadableConsoleEmailBackend
DEFAULT_FROM_EMAIL=noreply@example.com
ADMIN_EMAIL=admin@example.comСоберите и запустите контейнеры:
docker compose build
docker compose upПри старте web контейнер применяет миграции и запускает сервер:
http://localhost:8000
Создайте и активируйте виртуальное окружение, затем установите зависимости:
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txtПримените миграции и запустите сервер:
python manage.py migrate
python manage.py runserverДля Celery локально должен быть доступен Redis:
celery -A config worker -l infoБазовый URL:
http://localhost:8000/api/v1
Основные endpoint:
POST /user/register
POST /user/register/confirm
POST /user/login
GET /user/details
POST /user/details
POST /user/password_reset
POST /user/password_reset/confirm
GET /user/contact
POST /user/contact
PUT /user/contact
DELETE /user/contact
GET /shops
GET /categories
GET /products
GET /products/<id>
GET /basket
POST /basket
PUT /basket
DELETE /basket
GET /order
POST /order
GET /order/<id>
POST /order/<id>/status
POST /partner/update
GET /partner/export
GET /partner/state
POST /partner/state
GET /partner/orders
Защищенные endpoint используют DRF token auth:
Authorization: Token <token>Токен возвращается после успешного входа:
POST /api/v1/user/login
По умолчанию для локальной разработки используется читаемый консольный backend:
EMAIL_BACKEND=orders.email_backends.ReadableConsoleEmailBackendПисьма подтверждения регистрации и сброса пароля выводятся в логах контейнера celery:
docker compose logs -f celeryПоставщик отправляет ссылку на YAML-файл:
POST /api/v1/partner/update
Пример form-data:
url=https://raw.githubusercontent.com/netology-code/python-final-diplom/master/data/shop1.yaml
Импорт запускается через Celery. Статус выполнения смотрите в логах celery.
Экспорт текущего прайса поставщика доступен через endpoint:
GET /api/v1/partner/export
Ответ возвращается как YAML-файл.
Также импорт YAML доступен через Django Admin на странице товарных позиций. Для этого используются кастомные admin-шаблоны: orders/templates/admin/orders/productinfo/change_list.html и orders/templates/admin/orders/productinfo/import_yaml.html.
Запуск тестов:
.\.venv\Scripts\python.exe -m pytestЕсли нужно отключить pytest cache:
.\.venv\Scripts\python.exe -m pytest -p no:cacheproviderТесты находятся в каталоге orders/tests/ и покрывают основные сценарии API и бизнес-логики:
test_api_auth.pyпроверяет регистрацию, подтверждение email, вход, просмотр и обновление профиля, сброс пароля.test_api_contacts.pyпроверяет создание, получение, обновление и удаление контактов пользователя.test_api_products.pyпроверяет публичные endpoint для списка и деталей товаров, магазинов и категорий.test_api_basket.pyпроверяет полный цикл работы с корзиной: добавление, просмотр, изменение количества и удаление товаров.test_api_orders.pyпроверяет оформление корзины в заказ, получение списка заказов и детали заказа.test_api_partner.pyпроверяет endpoint поставщика: обновление и экспорт прайса, изменение статуса приема заказов, просмотр заказов магазина и изменение статуса заказа.test_import.pyпроверяет импорт товаров из YAML-файла на уровне сервисного слоя.test_tasks.pyпроверяет Celery-задачи отправки email и импорта товаров.test_models.pyпроверяет строковые представления основных моделей.
Во время тестов Celery работает в eager-режиме, а письма сохраняются в памяти через Django locmem email backend. Это позволяет проверять фоновые задачи и email-сценарии без Redis и реальной почты.
config/ настройки Django, URL проекта, Celery
orders/ основное приложение
orders/models.py модели пользователей, магазинов, товаров и заказов
orders/serializers.py serializers для API
orders/views.py API views
orders/services.py импорт товаров из YAML
orders/tasks.py Celery-задачи
orders/templates/ кастомные шаблоны Django Admin для импорта YAML
orders/tests/ тесты
import_data/ пример YAML-файла
- Redis внутри Docker доступен сервисам по адресу
redis:6379.