ちゅうかなPyPI

2023/06/06

何様

前略ごきげんよう。

[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として実装しないのはよいとして、なぜ方法があるのに説明しないのか。
なにやら闇を感じます。

ソーシャル/購読

X Threads note
RSS Feedly Inoreader

このブログを検索

ブログ アーカイブ