Це не лише змінить max_retries, але й увімкне стратегію, що забезпечує запити на всі http: // адреси сну протягом періоду часу, перш ніж повторити спробу (в цілому 5 разів):
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
s = requests.Session()
retries = Retry(total=5,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
s.get('http://httpstat.us/500')
Відповідно до документації дляRetry
: якщо backoff_factor дорівнює 0,1 , режим сну () буде спати протягом [0,1s, 0,2s, 0,4s, ...] між повторними спробами. Також буде застосовано повторне повторне повторення, якщо повернутий код стану 500 , 502 , 503 або 504 .
Різні інші параметри Retry
для більш детального контролю:
- total - загальна кількість повторних спроб.
- connect - Скільки помилок, пов’язаних із підключенням, щоб повторити спробу.
- read - Скільки разів повторити помилки читання.
- переадресація - скільки переадресацій виконувати.
- method_whitelist - набір верхніх значень дієслів методу HTTP, з якими нам слід спробувати.
- status_forcelist - Набір кодів HTTP-статусу, на який нам слід змусити повторити.
- backoff_factor - Коефіцієнт, що застосовується між спробами.
- підвищити_on_redirect - чи вичерпано кількість переадресацій, підняти а
MaxRetryError
чи повернути відповідь з кодом відповіді в діапазоні 3xx .
- підвищити_on_status - Подібне значення, як підвищити_on_redirect : чи слід підняти виняток, чи повернути відповідь, якщо статус потрапляє у діапазон status_forcelist і спроби вичерпані.
Примітка : підвищення_on_status є відносно новим, і він ще не перетворив його на випуск urllib3 або запитів. Raise_on_status аргумент ключового словаздається, зробили це в стандартну бібліотеку найбільш пітон версії 3.6.
Щоб повторити запити на конкретних кодах статусу HTTP, використовуйте status_forcelist . Наприклад, status_forcelist = [503] повторить спробу коду статусу 503 (послуга недоступна).
За замовчуванням повторний повтор спрацьовує лише для цих умов:
- Не вдалося отримати з'єднання з пулом.
TimeoutError
HTTPException
підвищений (з http.client в Python 3 else httplib ). Це здається, що винятки HTTP низького рівня, наприклад, URL-адреса чи протокол, сформовані неправильно.
SocketError
ProtocolError
Зауважте, що це всі винятки, які не дозволяють отримувати регулярну відповідь HTTP. Якщо генерується якась регулярна відповідь, повторне повторення не робиться. Без використання status_forcelist навіть відповідь зі статусом 500 не буде повторена.
Щоб змусити його вести себе більш інтуїтивно зрозуміло для роботи з віддаленим API або веб-сервером, я б використав описаний вище фрагмент коду, який змушує повторно використовувати статуси 500 , 502 , 503 та 504 , і все це не рідкість у Інтернету та (можливо) відновлюваного з огляду на достатньо великий період часу.
ВЕДЕНО : Retry
клас імпорту безпосередньо з urllib3 .