Общие HTTP-клиенты в Python

Обработчики Python могут отправлять HTTP-запросы через ctx.http_client и ctx.https_client. Companion создаёт эти экземпляры HttpClient с пулами соединений один раз на процесс и предоставляет их всем обслуживающим потокам и компьютейшенам. Методы жизненного цикла ресурсов получают те же клиенты через ResourceContext.

Используйте клиенты после настройки Python companion. Поддерживаемые примеры запросов находятся в локальных HTTP-тестах: они проверяют GET, POST, тела ответов, коды состояния, cookie и перенаправления.

API запросов

HttpClient.request(method, url, *, headers=None, params=None, data=None, json=None, timeout=None) возвращает HttpResponse. Методы get, post, put, patch, delete и head принимают URL и те же именованные аргументы.

Аргумент

Назначение

headers

Заголовки запроса в виде словаря.

params

Параметры строки запроса в виде словаря.

data

Тело запроса, передаваемое клиенту Requests.

json

Значение для сериализации в JSON-тело запроса.

timeout

Число секунд или пара (connect_timeout, read_timeout) в секундах. Без переопределения таймаут соединения составляет 10 секунд, а чтения — 60 секунд. Это не общий срок выполнения запроса.

Передавайте параметры отдельного запроса при вызове. Не изменяйте состояние общего клиента из компьютейшена или ресурса.

Ответы и ошибки

HttpResponse предоставляет следующие поля и методы:

Поле или метод

Результат

status_code

Целочисленный HTTP-код состояния.

ok

Признак отсутствия HTTP-ошибки (4xx или 5xx). Ответ с перенаправлением тоже может иметь ok = True.

url

Конечный URL ответа после выполненных перенаправлений.

headers

Заголовки ответа в виде словаря.

content

Тело ответа в виде bytes.

text

Декодированное тело ответа.

json(**kwargs)

Тело ответа, декодированное как JSON; именованные аргументы передаются декодеру.

HTTP-код ошибки не вызывает исключение: проверяйте status_code или ok. Ошибки выполнения запроса и декодирования JSON передаются вашему коду. Обёртка не добавляет цикл повторных запросов; явно выберите правила повторов и идемпотентности для внешнего сервиса.

Клиенты не сохраняют cookie из ответов и не отправляют их автоматически в следующих запросах. По умолчанию перенаправления отключены: ответ 3xx возвращается напрямую. Положительное значение max_redirect_count разрешает переходы в пределах заданного лимита; превышение лимита вызывает исключение клиента.

Конфигурация

Блок companion в конфигурации узла-воркера задаёт http_client_config и https_client_config. Воркер передаёт эти блоки процессу Python через YT_FLOW_COMPANION_CONFIG; из каждого блока Python создаёт отдельный клиент. Схема на стороне воркера описана в TCompanionConfig.

Python-обёртка читает из каждого блока следующие ключи:

Ключ

Поведение Python

max_idle_connections

Размер пула соединений. Если значение не задано или равно 0, используется 8; положительное значение задаёт размер пула.

max_redirect_count

По умолчанию 0: переходы по перенаправлениям отключены. Положительное значение задаёт их лимит.

Остальные поля конфигурации HTTP/HTTPS-клиентов C++ эта Python-обёртка не применяет. В частности, таймаут Python-запроса задаётся аргументом timeout; поля таймаутов C++ его не заменяют. Размеры пулов не ограничивают число одновременно выполняемых запросов.

Доступность в тестах и встроенном коде

HttpClient, HttpClients и HttpResponse экспортируются из yt.yt.flow.library.python.companion. Можно создать HttpClient() с настройками по умолчанию или передать словарь поддерживаемых параметров.

Контекст выполнения, созданный вне обслуживающего кода companion, не получает клиенты автоматически. Чтение ctx.http_client или ctx.https_client без передачи клиентов вызывает ValueError. Тесты, которые создают контексты самостоятельно, должны передавать клиенты явно; см. тесты передачи клиентов в контекст.

Исходный код и тесты

Предыдущая
Следующая