262

Python の requests モジュールはシンプルで洗練されていますが、1 つ気になる点があります。次のようなメッセージでrequests.exception.ConnectionErrorを取得することができます。

Max retries exceeded with url: ...

これは、リクエストがデータへのアクセスを数回試行できることを意味します。しかし、ドキュメントのどこにも、この可能性についての単一の言及はありません。ソース コードを調べたところ、デフォルト (おそらく 0) の値を変更できる場所が見つかりませんでした。

リクエストの最大再試行回数をどうにかして設定することは可能ですか?

4

6 に答える 6

351

これは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 秒、...] スリープします。返されたステータス コードが500502503、または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 サーバーでより直感的に動作するように動作させるには、上記のコード スニペットを使用します。これは、ステータス500502503、および504で再試行を強制します。十分なバックオフ期間があれば、(おそらく) 回復可能です。

于 2016-02-19T11:50:58.540 に答える
208

再試行を行うのは基盤となるurllib3ライブラリです。別の最大再試行回数を設定するには、代替のトランスポートアダプターを使用します。

from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=5))

引数はmax_retries整数またはRetry()オブジェクトを取ります; 後者では、再試行される障害の種類をきめ細かく制御できます(整数値は、Retry()接続障害のみを処理するインスタンスに変換されます。接続が確立された後のエラーは、副作用につながる可能性があるため、デフォルトでは処理されません)。 。


古い答え、リクエストのリリースより前1.2.1

ライブラリはこれrequestsを実際に構成可能にするわけではなく、またそうするつもりもありません(このプルリクエストを参照してください)。現在(リクエスト1.1)、再試行回数は0に設定されています。本当に高い値に設定する場合は、これをグローバルに設定する必要があります。

import requests

requests.adapters.DEFAULT_RETRIES = 5

この定数は文書化されていません。将来のリリースでこれの処理方法が変わる可能性があるため、自分の危険で使用してください。

更新:そしてこれ変更されました。バージョン1.2.1では、クラスにパラメーターを設定するオプションmax_retriesが追加されたため、代替のトランスポートアダプターを使用する必要があります。上記を参照してください。デフォルトにパッチを適用しない限り、モンキーパッチアプローチは機能しなくなりました(あまりお勧めしません)。HTTPAdapter()HTTPAdapter.__init__()

于 2013-03-15T11:33:22.577 に答える