これにより、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、その後スリープ()試行間[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 –リダイレクトの数を使い果たした場合、を発生させる
MaxRetryError
か、3xxの応答コードで応答を返すか範囲の。
- raise_on_status -と同様の意味raise_on_redirect:私たちは例外を発生させ、またはステータスがに該当する場合、応答を返すべきかどうかstatus_forcelist範囲と再試行が使い果たされています。
注意:raise_on_statusは比較的新しいものであり、urllib3またはリクエストのリリースにはまだ含まれていません。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で珍しくありませんすべてが、十分に大きなバックオフ期間が与えられれば、Webおよび(おそらく)回復可能です。
EDITED:インポートRetry
から直接クラスurllib3。