Python · API · Средний уровень

Корзина

5 задач

Добавляйте, обновляйте и удаляйте товары в корзине с помощью авторизованных запросов.

Обзор Cart API

#
API корзины управляет корзиной покупок, привязанной к вашей учётной записи. Каждый запрос к эндпоинтам корзины требует авторизации — отправляйте заголовок Authorization так же, как и для эндпоинтов профиля. У корзины две группы эндпоинтов: Обзор корзины: ``` GET /api/cart/ Посмотреть корзину (итоговая сумма, список товаров) ``` Элементы корзины: ``` POST /api/cart/items/ Добавить продукт в корзину PATCH /api/cart/items/{id}/ Обновить количество одного товара DELETE /api/cart/items/{id}/ Удалить один товар DELETE /api/cart/items/ Очистить всю корзину ``` Ответ GET /api/cart/ выглядит так: ```json { "items": [ { "id": 42, "product": {"id": 7, "name": "Oak Chair", "price": "149.99", ...}, "quantity": 1, "products_price": "149.99" } ], "total_price": "149.99", "total_quantity": 1 } ``` Каждый элемент в корзине имеет собственный id (id элемента корзины, а не продукта). Он нужен для обновления или удаления конкретного товара. Чтобы добавить продукт в корзину, нужен его slug — возьмите его из поля `slug` в ответе /api/products/.

Добавление, обновление и удаление товаров из корзины

#
Полный рабочий процесс с корзиной — от пустой до изменённой и очищенной: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' # Сначала авторизуемся token = requests.post(f'{BASE_URL}/api/auth/token/', json={ 'username': 'alice42', 'password': 'securepass123', }).json()['token'] session = requests.Session() session.headers['Authorization'] = f'Token {token}' # Посмотреть пустую корзину cart = session.get(f'{BASE_URL}/api/cart/').json() print('Товаров в корзине:', len(cart['items'])) ``` Добавить продукт (нужен slug продукта из /api/products/): ```python # Получить продукт чтобы взять его slug product = session.get(f'{BASE_URL}/api/products/1/').json() product_slug = product['slug'] # Добавить с количеством 2 response = session.post(f'{BASE_URL}/api/cart/items/', json={ 'product_slug': product_slug, 'quantity': 2, }) print(response.status_code) # 201 Created item = response.json() cart_item_id = item['id'] # сохранить — нужен для обновления/удаления print('Id элемента корзины:', cart_item_id) ``` Обновить количество: ```python response = session.patch( f'{BASE_URL}/api/cart/items/{cart_item_id}/', json={'quantity': 5}, ) print(response.json()['quantity']) # 5 ``` Удалить этот товар: ```python response = session.delete(f'{BASE_URL}/api/cart/items/{cart_item_id}/') print(response.status_code) # 204 No Content ``` Очистить всю корзину сразу: ```python response = session.delete(f'{BASE_URL}/api/cart/items/') print(response.status_code) # 204 No Content # Проверить, что корзина пуста cart = session.get(f'{BASE_URL}/api/cart/').json() print('Товаров после очистки:', len(cart['items'])) # 0 ``` Обратите внимание на разницу между двумя DELETE эндпоинтами: /api/cart/items/{id}/ удаляет один товар, /api/cart/items/ (без id) — все товары.

Справочник Cart API

#
Эндпоинты корзины (все требуют авторизации): ``` GET /api/cart/ Посмотреть корзину с товарами и суммой POST /api/cart/items/ Добавить товар тело: {product_slug: str, quantity: int} возвращает: 201 + объект элемента корзины PATCH /api/cart/items/{id}/ Обновить количество тело: {quantity: int} возвращает: 200 + обновлённый элемент DELETE /api/cart/items/{id}/ Удалить один товар → 204 DELETE /api/cart/items/ Очистить все товары → 204 ``` Форма ответа корзины: ```json {"items": [...], "total_price": "149.99", "total_quantity": 1} ``` Объект элемента корзины: ```json {"id": 42, "product": {...}, "quantity": 2, "products_price": "299.98"} ``` Ключевое различие: ``` product.slug — slug продукта, используется при добавлении в корзину item.id — id элемента корзины, используется при patch/delete ```
01

Просмотреть корзину

#

Авторизуйтесь и отправьте GET к /api/cart/. Выведите количество товаров в корзине и итоговую сумму.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Получите токен
# 2. GET /api/cart/ и выведите количество товаров и сумму
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}
cart = requests.get(f'{BASE_URL}/api/cart/', headers=headers).json()
print(len(cart['items']))
print(cart['total_price'])
02

Добавить продукт в корзину

#

Найдите любой продукт из /api/products/ и добавьте его в корзину с количеством 1. Выведите id элемента корзины из ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Авторизуйтесь
# 2. Возьмите slug продукта из /api/products/
# 3. POST к /api/cart/items/ и выведите id элемента корзины
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

# Взять первый продукт — взять его slug
product_slug = requests.get(f'{BASE_URL}/api/products/').json()['results'][0]['slug']

response = requests.post(
    f'{BASE_URL}/api/cart/items/',
    json={'product_slug': product_slug, 'quantity': 1},
    headers=headers,
)
print(response.json()['id'])
03

Обновить количество товара

#

Добавьте продукт в корзину, затем обновите его количество до 3 через PATCH /api/cart/items/{id}/. Выведите обновлённое количество из ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Авторизуйтесь
# 2. Добавьте продукт
# 3. PATCH количество до 3
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

product_slug = requests.get(f'{BASE_URL}/api/products/').json()['results'][0]['slug']
item = requests.post(
    f'{BASE_URL}/api/cart/items/',
    json={'product_slug': product_slug, 'quantity': 1},
    headers=headers,
).json()

cart_item_id = item['id']
updated = requests.patch(
    f'{BASE_URL}/api/cart/items/{cart_item_id}/',
    json={'quantity': 3},
    headers=headers,
).json()
print(updated['quantity'])
04

Удалить один товар

#

Добавьте продукт в корзину, затем удалите его через DELETE /api/cart/items/{id}/. Проверьте, что корзина пуста, получив её снова и выведя количество товаров.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Авторизуйтесь
# 2. Добавьте продукт
# 3. Удалите этот товар
# 4. Проверьте что корзина пуста
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

product_slug = requests.get(f'{BASE_URL}/api/products/').json()['results'][0]['slug']
item = requests.post(
    f'{BASE_URL}/api/cart/items/',
    json={'product_slug': product_slug, 'quantity': 1},
    headers=headers,
).json()

requests.delete(f'{BASE_URL}/api/cart/items/{item["id"]}/', headers=headers)

cart = requests.get(f'{BASE_URL}/api/cart/', headers=headers).json()
print(len(cart['items']))
05

Добавить два продукта и очистить корзину

#

Добавьте два разных продукта в корзину. Выведите итоговую сумму. Затем очистите корзину через DELETE /api/cart/items/ и проверьте, что она пуста.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Авторизуйтесь
# 2. Добавьте два разных продукта
# 3. Выведите сумму
# 4. Очистите корзину
# 5. Подтвердите что корзина пуста
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

products = requests.get(f'{BASE_URL}/api/products/').json()['results']
product_slugs = [products[0]['slug'], products[1]['slug']]

for slug in product_slugs:
    requests.post(
        f'{BASE_URL}/api/cart/items/',
        json={'product_slug': slug, 'quantity': 1},
        headers=headers,
    )

cart = requests.get(f'{BASE_URL}/api/cart/', headers=headers).json()
print('сумма:', cart['total_price'])

requests.delete(f'{BASE_URL}/api/cart/items/', headers=headers)

cart = requests.get(f'{BASE_URL}/api/cart/', headers=headers).json()
print('товаров после очистки:', len(cart['items']))