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()
リクエストは再試行しません。
どうしましたか?
Urllib3では、POST
はデフォルトで再試行メソッドとして許可されていません(複数の挿入が発生する可能性があるため)。あなたはそれを強制することもできます:
Retry(total=3, method_whitelist=frozenset(['GET', 'POST']))
https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry を参照してください
粘り強さを利用できます。
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")