これはmax_retriesを変更するだけでなく、再試行する前にすべてのhttp://アドレスへのリクエストを一定期間スリープさせるバックオフ戦略も有効にします(合計 5 回まで):
import requests
from requests.adapters import HTTPAdapter, Retry
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.05 秒、0.1 秒、0.2 秒、0.4 秒、...] スリープします。返されたステータス コードが500、502、503、または504の場合も、再試行が強制されます。
Retry
より詳細な制御を可能にするその他のさまざまなオプション:
- total – 許可する再試行の総数。
- connect – 再試行する接続関連のエラーの数。
- read – 読み取りエラーで再試行する回数。
- リダイレクト– 実行するリダイレクトの数。
- method_whitelist – 再試行する必要がある大文字の HTTP メソッド動詞のセット。
- status_forcelist – 強制的に再試行する HTTP ステータス コードのセット。
- backoff_factor – 試行間に適用するバックオフ係数。
- raise_on_redirect – リダイレクトの数が使い果たされた場合、 を生成するか、 3xx範囲
MaxRetryError
の応答コードで応答を返すか。
- raise_on_status – raise_on_redirect と同様の意味:ステータスがstatus_forcelistの範囲内にあり、再試行が使い果たされた場合に、例外を発生させるか、応答を返す必要があるかどうか。
注意: raise_on_statusは比較的新しく、まだ urllib3 や requests のリリースにはなっていません。raise_on_statusキーワード引数は、せいぜい Python バージョン 3.6 で標準ライブラリに組み込まれたようです。
特定の HTTP ステータス コードでリクエストを再試行するには、status_forcelistを使用します。たとえば、status_forcelist=[503]は、ステータス コード503 (サービスを利用できません) で再試行します。
デフォルトでは、再試行は次の条件でのみ発生します。
- プールから接続を取得できませんでした。
TimeoutError
HTTPException
発生しました ( Python 3 のhttp.clientから、それ以外の場合はhttplib )。これは、URL やプロトコルが正しく形成されていないなど、低レベルの HTTP 例外のようです。
SocketError
ProtocolError
これらはすべて、通常の HTTP 応答の受信を妨げる例外であることに注意してください。通常の応答が生成された場合、再試行は行われません。status_forcelistを使用しないと、ステータス 500 の応答でも再試行されません。
リモート API または Web サーバーでより直感的に動作するように動作させるには、上記のコード スニペットを使用します。これは、ステータス500、502、503、および504で再試行を強制します。十分なバックオフ期間があれば、(おそらく) 回復可能です。