Проект представляет собой интернет-магазин с API, реализованным на Django REST Framework. Функционал позволяет:
- Управлять магазинами и товарами
- Импортировать данные о товарах
- Работать с корзиной и заказами
- Регистрировать пользователей и подтверждать email
- Отслеживать статус заказов через личный кабинет или админ-панель
- Python 3.11+
- Django 5.2.5
- Django REST Framework
- SQLite
- PyYAML
- django-rest-passwordreset (восстановление пароля)
DjangoProject/
│── manage.py
│── requirements.txt
│── data/shop1.yaml
│
├── Diplom/ # Конфигурация проекта
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
│
└── shop/ # Основное приложение
├── models.py
├── serializers.py
├── views.py
├── urls.py
├── services.py
├── signals.py
├── admin.py
└── tests.py
git clone https://github.com/parselxml/DpProject.git
cd DpProjectpython -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windowspip install -r requirements.txtСоздайте файл .env в корне проекта:
SECRET_KEY=секретный_ключ
DEBUG=True
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=ваш_email@gmail.com
EMAIL_HOST_PASSWORD=пароль_или_app_password
DEFAULT_FROM_EMAIL=ваш_email@gmail.com
python manage.py migratepython manage.py createsuperuserpython manage.py runserverОсновные сущности:
- User - Пользователи системы (покупатели и магазины)
- Shop - Магазины-партнеры
- Product - Товары с категориями
- Order - Заказы с различными статусами
- Contact - Контактная информация пользователей
- ProductInfo - Детальная информация о товарах
Методы аутентификации:
- Token Authentication
- Session Authentication
Роли пользователей:
- Покупатель (buyer) - Просмотр товаров, управление корзиной, оформление заказов
- Магазин (shop) - Управление товарами, просмотр заказов
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/v1/user/register |
Регистрация нового пользователя |
| POST | /api/v1/user/register/confirm |
Подтверждение email |
| POST | /api/v1/user/login |
Авторизация |
| POST | /api/v1/user/password_reset |
Запрос сброса пароля |
| POST | /api/v1/user/password_reset/confirm |
Подтверждение сброса пароля |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/user/details |
Получение данных пользователя |
| POST | /api/v1/user/details |
Обновление данных пользователя |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/shops |
Список активных магазинов |
| GET | /api/v1/categories |
Список категорий |
| GET | /api/v1/products |
Поиск товаров с фильтрацией |
| GET | /api/v1/products/{id} |
Детальная информация о товаре |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/basket |
Просмотр корзины |
| POST | /api/v1/basket |
Добавление товаров в корзину |
| PUT | /api/v1/basket |
Обновление количества товаров |
| DELETE | /api/v1/basket |
Удаление товаров из корзины |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/order |
История заказов |
| POST | /api/v1/order |
Оформление заказа |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/user/contact |
Получение контактов |
| POST | /api/v1/user/contact |
Добавление контакта |
| PUT | /api/v1/user/contact |
Обновление контакта |
| DELETE | /api/v1/user/contact |
Удаление контактов |
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/v1/partner/update |
Импорт прайс-листа |
| GET | /api/v1/partner/state |
Получение статуса магазина |
| POST | /api/v1/partner/state |
Изменение статуса магазина |
| GET | /api/v1/partner/orders |
Заказы магазина |
POST /api/v1/user/register
Тело запроса:
{
"first_name": "Иван",
"last_name": "Иванов",
"email": "ivan@example.com",
"password": "securepassword123",
"company": "ООО Ромашка",
"position": "Менеджер"
}Успешный ответ:
{
"Status": true
}Ошибка:
{
"Status": false,
"Errors": {
"password": ["Пароль слишком простой"]
}
}POST /api/v1/user/register/confirm
Тело запроса:
{
"email": "ivan@example.com",
"token": "abc123def456"
}Успешный ответ:
{
"Status": true
}Ошибка:
{
"Status": false,
"Errors": "Неправильно указан токен или email"
}POST /api/v1/user/login
Тело запроса:
{
"email": "ivan@example.com",
"password": "securepassword123"
}Успешный ответ:
{
"Status": true,
"Token": "c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d"
}Ошибка:
{
"Status": false,
"Errors": "Ошибка авторизации"
}POST /api/v1/user/password_reset
Тело запроса:
{
"email": "ivan@example.com"
}Успешный ответ:
{
"Status": true
}GET /api/v1/user/details
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
{
"id": 1,
"first_name": "Иван",
"last_name": "Иванов",
"email": "ivan@example.com",
"company": "ООО Ромашка",
"position": "Менеджер",
"contacts": [
{
"id": 1,
"city": "Москва",
"street": "Ленина",
"house": "10",
"structure": "",
"building": "",
"apartment": "25",
"phone": "+79161234567"
}
]
}POST /api/v1/user/details
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"first_name": "Иван",
"last_name": "Петров",
"company": "ИП Петров",
"position": "Директор"
}Успешный ответ:
{
"Status": true
}GET /api/v1/shops
Успешный ответ:
[
{
"id": 1,
"name": "Магазин электроники",
"state": true
},
{
"id": 2,
"name": "Книжный магазин",
"state": true
}
]GET /api/v1/categories
Успешный ответ:
[
{
"id": 1,
"name": "Электроника"
},
{
"id": 2,
"name": "Книги"
}
]GET /api/v1/products?shop_id=1&category_id=2
Успешный ответ:
[
{
"id": 1,
"model": "XYZ-100",
"product": {
"name": "Смартфон",
"category": "Электроника"
},
"shop": 1,
"quantity": 15,
"price": 25000,
"price_rrc": 27000,
"product_parameters": [
{
"parameter": "Цвет",
"value": "Черный"
},
{
"parameter": "Память",
"value": "128GB"
}
]
}
]GET /api/v1/products/1
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
{
"id": 1,
"model": "XYZ-100",
"product": {
"name": "Смартфон",
"category": "Электроника"
},
"shop": 1,
"quantity": 15,
"price": 25000,
"price_rrc": 27000,
"product_parameters": [
{
"parameter": "Цвет",
"value": "Черный"
}
]
}GET /api/v1/basket
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
[
{
"id": 5,
"ordered_items": [
{
"id": 10,
"product_info": {
"id": 1,
"model": "XYZ-100",
"product": {
"name": "Смартфон",
"category": "Электроника"
},
"shop": 1,
"quantity": 15,
"price": 25000,
"price_rrc": 27000,
"product_parameters": [
{
"parameter": "Цвет",
"value": "Черный"
}
]
},
"quantity": 2
}
],
"state": "basket",
"dt": "2024-01-15T10:30:00Z",
"total_sum": 50000,
"contact": null
}
]POST /api/v1/basket
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"items": "[{\"product_info\": 1, \"quantity\": 2}]"
}Успешный ответ:
{
"Status": true,
"Создано объектов": 1
}PUT /api/v1/basket
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"items": "[{\"id\": 10, \"quantity\": 3}]"
}Успешный ответ:
{
"Status": true,
"Обновлено объектов": 1
}DELETE /api/v1/basket?items=10,11
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
{
"Status": true,
"Удалено объектов": 2
}GET /api/v1/user/contact
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
[
{
"id": 1,
"city": "Москва",
"street": "Ленина",
"house": "10",
"structure": "",
"building": "",
"apartment": "25",
"phone": "+79161234567"
}
]POST /api/v1/user/contact
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"city": "Санкт-Петербург",
"street": "Невский проспект",
"house": "25",
"apartment": "10",
"phone": "+79169876543"
}Успешный ответ:
{
"Status": true
}PUT /api/v1/user/contact
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"id": 1,
"city": "Москва",
"street": "Тверская",
"house": "15"
}Успешный ответ:
{
"Status": true
}DELETE /api/v1/user/contact
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"items": "1,2"
}Успешный ответ:
{
"Status": true,
"Удалено объектов": 2
}GET /api/v1/order
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
[
{
"id": 100,
"ordered_items": [
{
"id": 200,
"product_info": {
"id": 1,
"model": "XYZ-100",
"product": {
"name": "Смартфон",
"category": "Электроника"
},
"shop": 1,
"quantity": 15,
"price": 25000,
"price_rrc": 27000,
"product_parameters": [
{
"parameter": "Цвет",
"value": "Черный"
}
]
},
"quantity": 1
}
],
"state": "new",
"dt": "2024-01-15T11:30:00Z",
"total_sum": 25000,
"contact": {
"id": 1,
"city": "Москва",
"street": "Ленина",
"house": "10",
"structure": "",
"building": "",
"apartment": "25",
"phone": "+79161234567"
}
}
]POST /api/v1/order
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"id": 5,
"contact": 1
}Успешный ответ:
{
"Status": true
}POST /api/v1/partner/update
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"url": "https://example.com/prices.yml"
}Успешный ответ:
{
"Status": true
}GET /api/v1/partner/state
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
{
"id": 1,
"name": "Магазин электроники",
"state": true
}POST /api/v1/partner/state
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Тело запроса:
{
"state": false
}Успешный ответ:
{
"Status": true
}GET /api/v1/partner/orders
Заголовки:
Authorization: Token c84a6b3d9f2e4a7b8c1d5e6f7a8b9c0d
Успешный ответ:
[
{
"id": 100,
"ordered_items": [
{
"id": 200,
"product_info": {
"id": 1,
"model": "XYZ-100",
"product": {
"name": "Смартфон",
"category": "Электроника"
},
"shop": 1,
"quantity": 15,
"price": 25000,
"price_rrc": 27000,
"product_parameters": [
{
"parameter": "Цвет",
"value": "Черный"
}
]
},
"quantity": 1
}
],
"state": "new",
"dt": "2024-01-15T11:30:00Z",
"total_sum": 25000,
"contact": {
"id": 1,
"city": "Москва",
"street": "Ленина",
"house": "10",
"structure": "",
"building": "",
"apartment": "25",
"phone": "+79161234567"
}
}
]