В этом разделе мы будем практиковатся на специальном сайте созданным мной для этого.
Этот сайт представляет собой фейковый интернет-магазин, который полностью работает как настоящий. У него есть и обычный пользоваетльсктй интерфейс в браузере и полное покрытие всех возможностей через RESTful API.
Ниже я предоставлю сразу несколько ссылок, чтоб вы могли перейти на этот сайт и ознакомиться с ним перед материалами и упражнениями этого раздела:
Главная страница сайта с информацией о нем:
[https://apilearn.tukas.dev/](https://apilearn.tukas.dev/)
Специально сделанная подробная документация по его API (не переживайте, вы сейчас начнете ее понимать):
[https://apilearn.tukas.dev/api/docs/](https://apilearn.tukas.dev/api/docs/)
Хорошо, после беглого знакомства с сайтом, давайте приступим к изучению работы с API.
Веб строится на простом обмене: клиент отправляет запрос, сервер отправляет ответ. Когда вы вводите URL в браузере, браузер является клиентом. С библиотекой requests ваш Python-скрипт становится клиентом.
Установите один раз:
```bash
pip install requests
```
Чтобы получить данные, используйте requests.get() с URL:
```python
import requests
response = requests.get('https://apilearn.tukas.dev/api/products/')
print(response.status_code) # 200
```
Возвращаемое значение — объект Response. Он содержит всё, что отправил сервер: код статуса, заголовки ответа и тело.
Коды статуса — трёхзначные числа, которые говорят, что произошло:
- 2xx — успех. 200 означает OK, 201 — ресурс создан.
- 4xx — ошибка клиента. Вы сделали плохой запрос (400), забыли авторизацию (401) или запросили что-то, что не существует (404).
- 5xx — ошибка сервера. Сервер упал или перегружен.
Атрибут .ok даёт быструю булеву проверку — True для любого статуса 2xx, False для всего остального:
```python
if response.ok:
print('получен валидный ответ')
else:
print(f'запрос завершился ошибкой со статусом {response.status_code}')
```
Распространённая ошибка — вызывать .json() без проверки .ok. Если сервер возвращает 404, .json() либо выбросит исключение, либо вернёт пейлоад с ошибкой — не те данные, которые вы ожидали. Всегда проверяйте перед чтением.
Когда вы убедились, что ответ успешен, прочитайте тело с помощью .json(). Метод разбирает JSON-строку и возвращает dict или list Python:
```python
import requests
response = requests.get('https://apilearn.tukas.dev/api/products/')
data = response.json()
print(data['count']) # 372 — всего продуктов в базе
print(data['next']) # URL следующей страницы
print(len(data['results'])) # элементов на этой странице (20 по умолчанию)
```
Каждый элемент в results — это dict. Доступ к полям через стандартную нотацию с ключом:
```python
first = data['results'][0]
print(first['name']) # 'Tea Table Set with Three Chairs'
print(first['price']) # '150.00'
print(first['sell_price']) # '135.00'
print(first['category']['name']) # 'Kitchen'
```
Цены возвращаются как строки ('150.00'), а не числа с плавающей точкой. Это обычно для API — арифметика с float может вносить мелкие погрешности при работе с деньгами. Конвертируйте через float() или Decimal, если нужны вычисления.
Заголовки ответа доступны через .headers, который работает как нечувствительный к регистру dict:
```python
print(response.headers['Content-Type']) # application/json
print(response.headers.get('X-Request-Id')) # None, если заголовок отсутствует
```
Используйте .get() вместо прямого обращения по ключу, когда заголовок может отсутствовать — иначе получите KeyError.
Атрибуты объекта Response:
```
.status_code integer HTTP-код статуса (200, 404, 500, ...)
.ok bool True, если status_code < 400
.json() dict/list Разбор тела ответа как JSON
.text str Тело ответа как декодированная строка
.content bytes Тело ответа как сырые байты
.headers dict-like Заголовки ответа (ключи нечувствительны к регистру)
.url str Финальный URL после всех перенаправлений
```
Безопасный паттерн чтения JSON:
```python
response = requests.get(url)
if response.ok:
data = response.json()
else:
print(f'Ошибка {response.status_code}: {response.text}')
```
Распространённые коды статуса:
```
200 OK Запрос выполнен, тело содержит данные
201 Created Ресурс создан (после POST)
400 Bad Request Ваш запрос содержит невалидные параметры
401 Unauthorized Требуется аутентификация
403 Forbidden Аутентифицирован, но доступ запрещён
404 Not Found Ресурс не существует
500 Internal Server Error Ошибка на стороне сервера
```
Выполните GET /api/products/ и выведите общее количество продуктов в базе данных. Количество находится в JSON-ответе, а не в длине списка results на этой странице.
import requests
BASE_URL = 'https://apilearn.tukas.dev'
response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()
# Выведите общее количество продуктов
Получите список продуктов и выведите name и sell_price первого продукта в results.
import requests
BASE_URL = 'https://apilearn.tukas.dev'
response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()
# Выведите name и sell_price первого продукта
Решение
import requests
BASE_URL = 'https://apilearn.tukas.dev'
response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()
first = data['results'][0]
print(first['name'])
print(first['sell_price'])
Выполните GET-запрос к https://apilearn.tukas.dev/api/products/. Используйте response.ok, чтобы вывести 'Успех', если запрос удался, или 'Ошибка: {status_code}', если нет.
import requests
BASE_URL = 'https://apilearn.tukas.dev'
response = requests.get(f'{BASE_URL}/api/products/')
# Проверьте response.ok и выведите соответствующее сообщение
Мы используем необходимые cookies для работы сайта. С вашего разрешения мы также можем сохранять настройки сайта и использовать аналитические и рекламные cookies, чтобы понимать использование сайта и поддерживать развитие проекта.
* Вы всегда можете изменить свой выбор в настройках сайта.
Выберите категории cookies
Настройки аналитики
Можно отключить аналитику использования платформы. Также можно отправить в Google Analytics запрос на удаление данных об использовании этого сайта, связанных с этим браузером.
Учебный workspace
Учитесь, читая, запуская код и решая задачи.
Практикуйте программирование с пояснениями тем, упражнениями, инструментами browser IDE, проверкой regex и тренировкой печати кода в одном workspace.
Открывайте инструменты во вкладках.Упражнения, IDE-инструменты и тренажеры остаются доступными как вкладки сайта.
Переключайтесь без потери контекста.Переходите между пояснениями, кодом и утилитами, сохраняя свое место.
Используйте sidebar как карту.Левые панели содержат навигацию, настройки, файлы, libraries и управление инструментами.
PythonJavaScriptSQLite
Одна IDE, три практичных режима
Python в браузере.Запускайте небольшие скрипты, пробуйте библиотеки и тренируйте API-запросы без установки.
JavaScript для быстрых экспериментов.Проверяйте код для браузера и сравнивайте идеи рядом с учебными материалами.
SQLite для практики с данными.Открывайте обозреватель базы данных, изучайте таблицы, пишите запросы и учитесь SQL локально.
ТемаIDE
Работайте рядом в split tabs
Держите инструкции перед глазами.Откройте упражнение или справочную страницу рядом с IDE, вместо постоянных переключений.
Сравнивайте инструменты во время обучения.Размещайте проверки regex, пояснения и эксперименты с кодом рядом, когда это нужно для задачи.
Закройте split, когда закончите.Workspace вернётся к одной сфокусированной вкладке, а открытые вкладки сайта останутся доступны.
Тренажер слепой печати кода
Или просто текста
Тренажер рассчитан на физическую клавиатуру.Откройте этот раздел на ноутбуке или компьютере с широким экраном. На телефоне тренировка слепой печати не будет корректной.
Скорость: 0 зн/мин
0 слов/мин
Лучшая скорость (60с): 0 зн/мин
0 слов/мин
Ошибки: 0
Общее время: 0.0 с
Для активации режима слепого набора не подсматривайте на физическую клавиатуру.