Python · API · Начальный уровень

Query-параметры

6 задач

Фильтруйте, ищите, сортируйте и пагинируйте результаты API с помощью query-параметров.

Фильтрация и сортировка через params={}

#
Параметры запроса — это пары ключ-значение, которые добавляются к URL после знака вопроса: ``` https://apilearn.tukas.dev/api/products/?category=kitchen&ordering=price ``` Они позволяют серверу понять, что вы хотите: какую категорию, какую страницу, как сортировать. Можно строить такую строку вручную, но библиотека requests предлагает удобный способ: передайте dict как аргумент params, и она сама займётся кодированием: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' params = { 'category': 'kitchen', 'ordering': 'price', } response = requests.get(f'{BASE_URL}/api/products/', params=params) print(response.url) # показывает полный URL, который был отправлен ``` response.url полезен для отладки — он показывает точный URL, который построила библиотека, включая все закодированные параметры. Эндпоинт /api/products/ принимает следующие параметры: - category — фильтр по slug категории (например, 'kitchen', 'bedroom') - ordering — поле сортировки; префикс - для убывающего порядка (например, 'price', '-price', 'name') - search — полнотекстовый поиск в названиях и описаниях продуктов - min_price / max_price — фильтр по диапазону цены - has_discount — установите 'true', чтобы вернуть только продукты со скидкой - page / page_size — пагинация (рассматривается в теме Pagination) Параметры можно свободно комбинировать. Сервер применяет все фильтры вместе, поэтому можно запросить товары для спальни до $200, отсортированные по названию, одним запросом.

Фильтрация, сортировка и поиск — паттерны

#
Фильтр по одной категории: ```python response = requests.get(f'{BASE_URL}/api/products/', params={'category': 'office'}) data = response.json() print(data['count']) # продукты только в категории office ``` Фильтр по диапазону цены: ```python params = {'min_price': 50, 'max_price': 150} response = requests.get(f'{BASE_URL}/api/products/', params=params) for product in response.json()['results']: print(product['name'], product['sell_price']) ``` Сортировка по цене убывающей (самые дорогие первыми): ```python params = {'ordering': '-price', 'page_size': 5} response = requests.get(f'{BASE_URL}/api/products/', params=params) for p in response.json()['results']: print(p['name'], p['price']) ``` Поиск по ключевому слову: ```python params = {'search': 'chair'} response = requests.get(f'{BASE_URL}/api/products/', params=params) print(response.json()['count'], 'продуктов найдено') ``` Комбинация нескольких фильтров в одном запросе: ```python params = { 'category': 'bedroom', 'max_price': 300, 'has_discount': 'true', 'ordering': 'name', } response = requests.get(f'{BASE_URL}/api/products/', params=params) data = response.json() print(f'{data["count"]} уценённых товаров для спальни до $300') ``` Обратите внимание: has_discount принимает строку 'true', а не булево значение Python True. Параметры запроса в HTTP — всегда строки; requests конвертирует простые значения, но с булевоподобными флагами лучше быть явными.

Справочник query-параметров

#
Параметры запроса для GET /api/products/: ``` category string Slug категории: kitchen, bedroom, living-room, office, hardware, decor, bathroom, kids-room, outdoor, dining-room, storage, lighting ordering string Поле сортировки. Префикс - для убывающего порядка: price, -price, name, -name search string Полнотекстовый поиск в названии и описании min_price number Минимальная цена (включительно) max_price number Максимальная цена (включительно) has_discount string 'true' — вернуть только продукты со скидкой page int Номер страницы (по умолчанию: 1) page_size int Элементов на странице (по умолчанию: 20) ``` Все параметры необязательны и могут комбинироваться. Ответ всегда содержит count, next, previous и results. Быстрые примеры: ```python # 5 самых дешёвых товаров в категории kitchen params = {'category': 'kitchen', 'ordering': 'price', 'page_size': 5} # Все товары со скидкой params = {'has_discount': 'true'} # Продукты по запросу 'table' от $50 до $300 params = {'search': 'table', 'min_price': 50, 'max_price': 300} ```
01

Фильтр по категории

#

Получите все продукты в категории "bedroom" и выведите их общее количество.

import requests

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

# Получите товары категории bedroom и выведите общее количество
Решение
import requests

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

params = {'category': 'bedroom'}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
data = response.json()
print(data['count'])
02

Фильтр по диапазону цены

#

Получите продукты с ценой от $50 до $100 и выведите название и sell_price каждого продукта на первой странице.

import requests

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

# Получите продукты от $50 до $100
Решение
import requests

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

params = {'min_price': 50, 'max_price': 100}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['sell_price'])
03

Сортировка результатов

#

Получите 5 самых дорогих продуктов во всём каталоге и выведите их названия и цены.

import requests

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

# Получите 5 самых дорогих продуктов
Решение
import requests

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

params = {'ordering': '-price', 'page_size': 5}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['price'])
04

Поиск по ключевому слову

#

Найдите все продукты, содержащие слово "table", и выведите количество найденных результатов.

import requests

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

# Найдите 'table' и выведите количество результатов
Решение
import requests

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

params = {'search': 'table'}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
print(response.json()['count'])
05

Комбинация нескольких фильтров

#

Получите товары со скидкой в категории "dining-room" с ценой до $400, отсортированные по названию в алфавитном порядке. Выведите название и sell_price каждого результата.

import requests

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

# Комбинируйте category, max_price, has_discount и ordering
Решение
import requests

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

params = {
    'category': 'dining-room',
    'max_price': 400,
    'has_discount': 'true',
    'ordering': 'name',
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['sell_price'])
06

Проверьте построенный URL

#

Постройте запрос с category="office", ordering="-price", page_size=3. Перед тем как читать ответ, выведите полный URL, который requests построил (включая все параметры запроса).

import requests

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

params = {
    'category': 'office',
    'ordering': '-price',
    'page_size': 3,
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)

# Выведите полный URL, который был отправлен
Решение
import requests

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

params = {
    'category': 'office',
    'ordering': '-price',
    'page_size': 3,
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
print(response.url)
print(response.json()['count'], 'всего результатов')