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

Заказы

5 задач

Оформляйте заказы из корзины и просматривайте историю своих заказов.

Процесс заказа и эндпоинты

#
Заказ представляет покупку — он фиксирует содержимое корзины в определённый момент времени. После оформления корзина автоматически очищается, а заказ становится доступным в истории покупок. Процесс заказа состоит из двух этапов: 1. Наполнить корзину — добавьте продукты через POST /api/cart/items/ (рассматривается в теме cart). 2. Оформить заказ — выполните POST к /api/orders/ с номером телефона в теле. Эндпоинты заказов: ``` POST /api/orders/ Оформить заказ из текущей корзины GET /api/orders/ Список всех ваших прошлых заказов GET /api/orders/{id}/ Детали одного заказа ``` Все эндпоинты заказов требуют авторизации. Оформленный заказ выглядит так: ```json { "id": 5, "created_timestamp": "2025-06-23T10:15:00Z", "phone_number": "+1234567890", "status": "Processing", "items": [ {"id": 5, "name": "Oak Chair", "price": "149.99", "quantity": 2} ] } ``` Обратите внимание: элементы плоские — каждый элемент имеет name, price и quantity непосредственно, без вложения под ключ product. Поле price фиксирует цену на момент покупки.

Оформление и просмотр заказов

#
Полный процесс — регистрация, добавление товаров, оформление заказа, просмотр истории: ```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}' # Добавить два продукта в корзину products = session.get(f'{BASE_URL}/api/products/').json()['results'] for product in products[:2]: session.post(f'{BASE_URL}/api/cart/items/', json={ 'product_slug': product['slug'], 'quantity': 1, }) # Оформить заказ — phone_number обязателен response = session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'}) print(response.status_code) # 201 Created order = response.json() print('Id заказа:', order['id']) print('Статус:', order['status']) print('Товаров:', len(order['items'])) ``` Список всех заказов: ```python orders = session.get(f'{BASE_URL}/api/orders/').json() print(f'У вас {orders["count"]} заказов') for o in orders['results']: print(f" Заказ #{o['id']} — {o['status']}") ``` Список заказов пагинирован, как и продукты. Каждый элемент в results имеет id, status, created_timestamp и items. Получить подробную информацию о конкретном заказе: ```python order_id = orders['results'][0]['id'] detail = session.get(f'{BASE_URL}/api/orders/{order_id}/').json() for item in detail['items']: print(f" {item['name']} x{item['quantity']} @ {item['price']}") ``` Если попробовать POST /api/orders/ с пустой корзиной — получите ошибку 400. Всегда проверяйте, что в корзине есть товары.

Справочник эндпоинтов заказов

#
Эндпоинты заказов (все требуют авторизации): ``` POST /api/orders/ Оформить заказ из текущей корзины тело: {phone_number: str} возвращает: 201 + объект заказа ошибка: 400, если корзина пуста GET /api/orders/ Список всех заказов (с пагинацией) возвращает: {count, next, previous, results: [...]} GET /api/orders/{id}/ Детали заказа возвращает: полный объект заказа с элементами ``` Поля объекта заказа: ``` id int Id заказа created_timestamp string ISO 8601 timestamp phone_number string Номер телефона, указанный при оформлении status string например, "Processing" items list Список элементов заказа ``` Объект элемента заказа: ``` id int Id элемента name string Название продукта на момент покупки price string Цена на момент покупки quantity int Заказанное количество ```
01

Оформить заказ

#

Добавьте хотя бы один продукт в корзину, затем выполните POST к /api/orders/, чтобы оформить заказ. Выведите id заказа и статус из ответа.

import requests

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

# 1. Авторизуйтесь
# 2. Добавьте продукт в корзину
# 3. POST /api/orders/ и выведите 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}'}

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

order = requests.post(
    f'{BASE_URL}/api/orders/',
    json={'phone_number': '+1234567890'},
    headers=headers,
).json()
print(order['id'])
print(order['status'])
02

Список заказов

#

Получите историю заказов из GET /api/orders/. Выведите количество заказов и id и статус каждого.

import requests

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

# GET /api/orders/ и выведите количество + каждый заказ
Решение
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}'}
data = requests.get(f'{BASE_URL}/api/orders/', headers=headers).json()
print(f'{data["count"]} заказов')
for order in data['results']:
    print(f"  #{order['id']} — {order['status']}")
03

Детали заказа

#

Оформите заказ, затем получите его детали из GET /api/orders/{id}/. Выведите название, количество и цену каждого товара.

import requests

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

# 1. Авторизуйтесь, добавьте товары, оформите заказ
# 2. GET /api/orders/{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}'}

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

order = requests.post(
    f'{BASE_URL}/api/orders/',
    json={'phone_number': '+1234567890'},
    headers=headers,
).json()
order_id = order['id']

detail = requests.get(f'{BASE_URL}/api/orders/{order_id}/', headers=headers).json()
for item in detail['items']:
    print(item['name'], item['quantity'], item['price'])
04

Полный процесс заказа

#

Выполните полный процесс в одном скрипте: авторизуйтесь, добавьте 3 продукта в корзину, оформите заказ, подтвердите что он есть в списке заказов, и выведите id заказа и количество товаров.

import requests

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

# Полный процесс: авторизация → добавление 3 товаров → заказ → подтверждение в списке
Решение
import requests

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

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

session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

products = session.get(f'{BASE_URL}/api/products/').json()['results'][:3]
for p in products:
    session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': p['slug'], 'quantity': 1})

order = session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'}).json()
order_id = order['id']

orders_list = session.get(f'{BASE_URL}/api/orders/').json()
order_ids = [o['id'] for o in orders_list['results']]
print(f'Заказ {order_id} в списке: {order_id in order_ids}')
print(f'Товаров: {len(order["items"])}')
05

Вычислить общую сумму затрат

#

Оформите два отдельных заказа (добавьте товары, оформите, добавьте ещё, оформите снова). Затем получите все заказы и вычислите общую сумму затрат по всем заказам. Выведите сумму.

import requests

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

# Оформите 2 заказа, затем суммируйте все затраты
Решение
import requests

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

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

session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

products = session.get(f'{BASE_URL}/api/products/').json()['results']

# Первый заказ
session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': products[0]['slug'], 'quantity': 1})
session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'})

# Второй заказ
session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': products[1]['slug'], 'quantity': 2})
session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'})

orders = session.get(f'{BASE_URL}/api/orders/').json()['results']
total_spend = sum(
    float(item['price']) * item['quantity']
    for o in orders
    for item in o['items']
)
print(f'Общая сумма: {total_spend:.2f}')