web-dev-qa-db-ja.com

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()リクエストは再試行しません。

どうしましたか?

21
user1554733

Urllib3では、POSTはデフォルトで再試行メソッドとして許可されていません(複数の挿入が発生する可能性があるため)。あなたはそれを強制することもできます:

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

https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry を参照してください

28

粘り強さを利用できます。

doc: 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")
0
samuel161