Python requests: повторить запрос с задержкой и backoff

Категория: Python · Язык: Python · Обновлено:

Для повторных HTTP-запросов при временных ошибках подключите urllib3 Retry к requests.Session через HTTPAdapter. Ограничьте число попыток, выберите повторяемые статусы и включите backoff.

Рабочий пример

Python
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(total=3, backoff_factor=0.4,
              status_forcelist=[429, 502, 503, 504],
              allowed_methods={"GET", "HEAD"})
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=retry))
response = session.get("https://api.example.test/status", timeout=(3, 10))
response.raise_for_status()

Кортеж timeout отдельно ограничивает подключение и чтение ответа. backoff_factor увеличивает паузу между повторениями; 429 может содержать Retry-After, который urllib3 учитывает в совместимых версиях.

Частый вопрос

Повторится ли POST автоматически?

В примере allowed_methods содержит только GET и HEAD. Добавляйте POST лишь когда API поддерживает идемпотентный ключ и повтор не создаст вторую операцию.