sendに入るすべてのオプションのパラメーターは、セッションでも設定可能であるようです(たとえば、verify、streamなど)。 タイムアウトを除く。
他のすべての引数と同じように、タイムアウトがセッションからマージされるように動作を変更することは可能でしょうか?
@ctheissねえ、この問題を提起してくれてありがとう!
これは以前に登場したもので、最近では#1987だけでなく、#1130と#1563(今年はすべて)でも発生しています。 ケネスは一般的に、この変更を行うことに関心がないことを表明しており、トランスポートアダプタを使用して行われることを期待しています。 あなたはあなたはそれを行うだろうかにいくつかのガイダンスを得ることに興味があるなら、私は助けて幸せだけど、私たちは追加されないと思うtimeout
にSession
。
申し訳ありませんが、これ以上お役に立てることはありません。
超迅速な対応をありがとう。 あなたが言及したものは完全に重複しているので、私は問題をよりよく検索する必要があります!
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')
これらを使用する場合は、他の動詞、たとえばpost
、 put
などにもこれを適用する必要があることに注意してください。 完全を期すために、私が使用しているものは次のとおりです。
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)
これが複数のモジュールで使用するとどのように機能するかはわかりません。リクエストを使用している各ファイルにシムが必要になると思います。
最も参考になるコメント
request
メソッドをシムしないのはなぜですか?