Как сделать запросы python .post() для повторной попытки?

Я пытаюсь реализовать повтор запросов в Python.
Это работает как шарм с запросами .get(), но запрос .post() никогда не повторяется, независимо от кода состояния. Я хотел бы использовать его с .post() запросами.

Мой код:

from requests.packages.urllib3.util import Retry
from requests.adapters import HTTPAdapter
from requests import Session, exceptions

s = Session()
s.mount('http://', HTTPAdapter(max_retries=Retry(total=2, backoff_factor=1, status_forcelist=[ 500, 502, 503, 504, 521])))
r = s.get('http://httpstat.us/500')
r2 = s.post('http://httpstat.us/500')

Таким образом, запросы .get() повторяются, а запросы .post() — нет.

Что случилось?


person Community    schedule 29.02.2016    source источник
comment
Это должно работать так, как вы ожидаете? GET запросы не повредят данные, но несколько POST могут. Я не читал документацию по API запросов, но звучит разумно, если это задумано.   -  person Jim Aho    schedule 29.02.2016


Ответы (2)


В urllib3 POST по умолчанию не разрешен как метод с повторной попыткой (поскольку он может привести к множественным вставкам). Вы можете заставить это, хотя:

Retry(total=3, allowed_methods=frozenset(['GET', 'POST']))

См. https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry

person Stanislav Shabalin    schedule 29.02.2016
comment
Не могли бы вы объяснить логику использования frozenset в этом фрагменте, пожалуйста? - person Amir Afianian; 05.01.2021
comment
@AmirAfianian Ознакомьтесь со связанной документацией для повторной попытки. Причина в том, чтобы быть согласованным по типу со значением по умолчанию allowed_methods=frozenset({'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE'}) - person Stanislav Shabalin; 01.02.2021

Вы можете использовать упорство.

документ: https://tenacity.readthedocs.io/en/latest/

И вы можете войти до или после

pip install tenacity
import logging

logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

logger = logging.getLogger(__name__)

@retry(stop=stop_after_attempt(3), before=before_log(logger, logging.DEBUG))
def post_something():
    # post
    raise MyException("Fail")
person samuel161    schedule 21.02.2020