Requests: 機能リクエスト:セッションにタイムアウトを追加

作成日 2014年04月21日  ·  11コメント  ·  ソース: psf/requests

sendに入るすべてのオプションのパラメーターは、セッションでも設定可能であるようです(たとえば、verify、streamなど)。 タイムアウトを除く。

他のすべての引数と同じように、タイムアウトがセッションからマージされるように動作を変更することは可能でしょうか?

最も参考になるコメント

requestメソッドをシムしないのはなぜですか?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

全てのコメント11件

@ctheissねえ、この問題を提起してくれてありがとう!

これは以前に登場したもので、最近では#1987だけでなく、#1130と#1563(今年はすべて)でも発生しています。 ケネスは一般的に、この変更を行うことに関心がないことを表明しており、トランスポートアダプタを使用して行われることを期待しています。 あなたはあなたはそれを行うだろうかにいくつかのガイダンスを得ることに興味があるなら、私は助けて幸せだけど、私たちは追加されないと思うtimeoutSession

申し訳ありませんが、これ以上お役に立てることはありません。

超迅速な対応をありがとう。 あなたが言及したものは完全に重複しているので、私は問題をよりよく検索する必要があります!

BaseAdapter (またはサブクラスHTTPAdapter )を実装してから、 mountを使用してサブクラスをセッションに関連付けるというアイデアはありますか? これは、「デフォルトのタイムアウト」を実装するだけでは奇妙なことに面倒に思えます(他のすべてがリクエストで驚くほど簡単であることを考えると)。

アイデアはHTTPAdapterをサブクラス化することです。 それほど面倒なことではありませんが、私たちがそれを行う主な理由は、ライブラリ内で概念的な区別を維持しているためです。 Sessionオブジェクトは、HTTP自体の動作に関するセッションに関する事項(Cookie、ヘッダーなど)を厳密に管理する必要があります。トランスポートアダプターは、ネットワーク接続の動作に関する事項(ソケット、タイムアウトなど)を管理します。

明確にするために、あなたの推薦は人々がこれをすることです?

class MyHTTPAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, timeout=None, *args, **kwargs):
        self.timeout = timeout
        super(MyHTTPAdapter, self).__init__(*args, **kwargs)

    def send(self, *args, **kwargs):
        kwargs['timeout'] = self.timeout
        return super(MyHTTPAdapter, self).send(*args, **kwargs)

s = requests.Session()
s.mount("http://", MyHTTPAdapter(timeout=10))

@staticshockはオプションです。 はい

しかし、より具体的には、それは_推奨事項_ですか?

ユーザーのニーズはさまざまであり、それらのユーザーのためにこれに対処する方法は多数あるため、具体的な推奨事項はありません。

@staticshock @ sigmavirus24

その解決策は非常に複雑に思えます。 以下は私のために働くようです。

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

@staticshock @ sigmavirus24

その解決策は非常に複雑に思えます。 以下は私のために働くようです。

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

これらを使用する場合は、他の動詞、たとえばpostputなどにもこれを適用する必要があることに注意してください。 完全を期すために、私が使用しているものは次のとおりです。

session = requests.Session()
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
    setattr(session, method, functools.partial(getattr(session, method), timeout=5))
# All methods of session should now timeout after 5 seconds

requestメソッドをシムしないのはなぜですか?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

モジュールレベルでグローバルに必要であり、セッションを使用していない場合は、次のことを実行できる可能性があります。

requests.api.request = functools.partial(requests.api.request, timeout=3)

これが複数のモジュールで使用するとどのように機能するかはわかりません。リクエストを使用している各ファイルにシムが必要になると思います。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

jake491 picture jake491  ·  3コメント

NoahCardoza picture NoahCardoza  ·  4コメント

remram44 picture remram44  ·  4コメント

avinassh picture avinassh  ·  4コメント

ReimarBauer picture ReimarBauer  ·  4コメント