Это не только изменит 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 , то sleep () будет бездействовать в течение [0,1 с, 0,2 с, 0,4 с, ...] между повторными попытками. Также будет произведена повторная попытка, если возвращен код состояния 500 , 502 , 503 или 504 .
Различные другие опции Retry
для более детального контроля:
- итого - общее количество повторных попыток.
- connect - Сколько ошибок, связанных с соединением, нужно повторить.
- read - сколько раз повторить попытку чтения.
- redirect - сколько перенаправлений выполнить.
- method_whitelist - Набор прописных глаголов метода HTTP, к которым мы должны повторить попытку.
- status_forcelist - набор кодов состояния HTTP, которые мы должны принудительно повторить.
- backoff_factor - Коэффициент отката, применяемый между попытками.
- подъем_он_редакта - следует ли, если количество перенаправлений исчерпано, увеличить
MaxRetryError
или вернуть ответ с кодом ответа в диапазоне 3хх .
- повышение_он_статуса - значение, аналогичное повышению_подключения : следует ли нам вызывать исключение или возвращать ответ, если состояние падает в диапазоне состояния_соглашения и повторные попытки были исчерпаны.
NB : повышение_он_стата является относительно новым и еще не превратило его в выпуск urllib3 или запросов. Raise_on_status аргумент ключевого словакажется, сделали это в стандартную библиотеку наиболее питон версии 3.6.
Чтобы повторять запросы на определенные коды состояния HTTP, используйте status_forcelist . Например, status_forcelist = [503] будет повторять попытку с кодом состояния 503 (услуга недоступна).
По умолчанию повтор запускается только для следующих условий:
- Не удалось получить соединение из пула.
TimeoutError
HTTPException
поднял (из http.client в Python 3 еще httplib ). Похоже, это низкоуровневые исключения HTTP, например, неправильно сформированный URL или протокол.
SocketError
ProtocolError
Обратите внимание, что все это исключения, которые препятствуют получению регулярного ответа HTTP. Если генерируется какой-либо регулярный ответ, повтор не выполняется. Без использования status_forcelist даже ответ со статусом 500 не будет повторен.
Чтобы заставить его вести себя более интуитивно понятным для работы с удаленным API или веб-сервером, я бы использовал приведенный выше фрагмент кода, который вызывает повторные попытки для статусов 500 , 502 , 503 и 504 , которые все нередки на сеть и (возможно) восстанавливаемый, учитывая достаточно большой период отсрочки.
Отредактировано : импортироватьRetry
класс напрямую из urllib3 .