[Python] requestsで合計タイムアウトを指定する方法
requestsとurllib3のソースコードを読んで見つけました。
import requests from urllib3.util import Timeout as TimeoutSauce resp = requests.get(url, timeout=TimeoutSauce(total=total_timeout))
Session下でデフォルト値を設定するにはHTTPAdapterをカスタマイズします。
import requests from requests.adapters import HTTPAdapter from urllib3.util import Timeout as TimeoutSauce class TimeoutHTTPAdapter(HTTPAdapter): def __init__(self, *args, **kwargs): self.timeout = None if "timeout" in kwargs: self.timeout = kwargs["timeout"] del kwargs["timeout"] super().__init__(*args, **kwargs) def send(self, request, **kwargs): timeout = kwargs.get("timeout") if timeout is None: kwargs["timeout"] = self.timeout return super().send(request, **kwargs) http = requests.Session() adapter = TimeoutHTTPAdapter(timeout=TimeoutSauce(total=total_timeout)) http.mount("https://", adapter) http.mount("http://", adapter) resp = http.get(url)
なぜ自作?
connectionとreadを別々に設定するなんて実用的とは思えません。
にもかかわらずインターネット上では方法が見つかりませんでした。
とくに以下の質問は、20以上も回答がついていて全員不正解という珍事。
自分も最初ここを見ていて時間をロスしました。
Timeout for python requests.get entire response
https://stackoverflow.com/questions/21965484/timeout-for-python-requests-get-entire-response
requests公式ドキュメントのミスリードが混乱の原因と思われます。
total timeoutのパラメーターなど存在しないかのような書きぶりですから。
requestsとして実装しないのはよいとして、なぜ方法があるのに説明しないのか。
なにやら闇を感じます。
0 件のコメント: