Я не уверен, что это правильный способ, так как не смог найти использования timeout
в этой документации.
Прокрутите вниз. Это определенно там. Вы можете найти его на странице, нажав Ctrl F и введя timeout
.
Вы timeout
правильно используете в своем примере кода.
На самом деле, вы можете указать тайм-аут несколькими различными способами, как объяснено в документации:
Если вы укажете единичное значение таймаута, например, вот так:
r = requests.get('https://github.com', timeout=5)
Значение таймаута будет применяться как к read
таймаутам, connect
так и к ним. Укажите кортеж, если вы хотите установить значения отдельно:
r = requests.get('https://github.com', timeout=(3.05, 27))
Если удаленный сервер работает очень медленно, вы можете сказать Requests to wait forever for a response, передав None в качестве значения таймаута, а затем получить чашку кофе.
r = requests.get('https://github.com', timeout=None)
Попробуйте использовать https://httpstat.us/200?sleep=5000
чтобы проверить свой код.
Например, это вызывает исключение, потому что 0.2 секунды недостаточно для установления соединения с сервером:
import requests
link = "https://httpstat.us/200?sleep=5000"
with requests.Session() as s:
try:
r = s.get(link, timeout=(0.2, 10))
print(r.text)
except requests.exceptions.Timeout as e:
print(e)
Выход:
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=0.2)
Это вызывает исключение, потому что сервер ждет 5 секунд перед отправкой ответа, что дольше установленного 2-х секундного read
тайм-аута:
import requests
link = "https://httpstat.us/200?sleep=5000"
with requests.Session() as s:
try:
r = s.get(link, timeout=(3.05, 2))
print(r.text)
except requests.exceptions.Timeout as e:
print(e)
Выход:
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=2)
Вы конкретно упоминаете использование таймаута в рамках сеанса. Поэтому, возможно, вам нужен объект сессии, который имеет таймаут по умолчанию. Что-то вроде этого:
import requests
link = "https://httpstat.us/200?sleep=5000"
class EnhancedSession(requests.Session):
def __init__(self, timeout=(3.05, 4)):
self.timeout = timeout
return super().__init__()
def request(self, method, url, **kwargs):
print("EnhancedSession request")
if "timeout" not in kwargs:
kwargs["timeout"] = self.timeout
return super().request(method, url, **kwargs)
session = EnhancedSession()
try:
response = session.get(link)
print(response)
except requests.exceptions.Timeout as e:
print(e)
try:
response = session.get(link, timeout=1)
print(response)
except requests.exceptions.Timeout as e:
print(e)
try:
response = session.get(link, timeout=10)
print(response)
except requests.exceptions.Timeout as e:
print(e)
Выход:
id="до 5"