Короткий ответ
Нужно вызвать requests.get(url, timeout=10), обязательно задать таймаут, проверить response.status_code или вызвать response.raise_for_status(), а затем безопасно разобрать тело ответа (response.json()), не предполагая, что запрос всегда успешен.
Как это работает подробнее
requests.get отправляет HTTP-запрос и возвращает объект Response с кодом статуса, заголовками и телом; без явного timeout запрос может зависнуть навсегда, если сервер не отвечает, а без проверки статуса скрипт попытается распарсить JSON из тела ошибки (например, HTML-страницы 502) и упадёт с непонятным исключением.
Пример кода
example-476.py
import requests
try:
response = requests.get("https://api.example.com/status", timeout=5)
response.raise_for_status()
except requests.exceptions.RequestException as exc:
print(f"Запрос не удался: {exc}")
else:
data = response.json()
print("Статус сервиса:", data.get("status"))Что использовать на практике
- Рекомендация. базовый надёжный вызов включает таймаут, проверку статуса и обработку сетевых исключений (
requests.exceptions.RequestException). Для регулярных вызовов стоит использоватьrequests.Session(), чтобы переиспользовать TCP-соединения, и логировать код статуса при ошибке для диагностики.
Подводные камни
- Ошибка. вызывать
requests.get(url)вообще безtimeout; парситьresponse.json()до проверки статуса, из-за чего при ошибке сервера скрипт падает сJSONDecodeErrorвместо понятного сообщения об HTTP-ошибке; игнорировать разницу между сетевой ошибкой (нет соединения) и HTTP-ошибкой (сервер ответил кодом 4xx/5xx).