avatar
Артём Шумейко
@artemshumeiko
07.07.2025 07:01
Ревьюим код вместе

Проводил недавно код-ревью и обратил внимание на этот участок кода (см. скрин).

Я сразу увидел грубую ошибку. Попробуйте найти ее, и потом открывайте спойлер 👇

Проблема в коде resp.json(). Многие (как и я) привыкли пользоваться синхронной библиотекой requests и при переходе на aiohttp по привычке пытаются получить данные синхронно.

Правильно писать await resp.json(). Это сперва может показаться контринтуитивно. Ведь можно получить resp.status (http код ответа) и resp.headers (заголовки) синхронно...

Что происходит на самом деле? Когда наш бэкенд получает ответ от внешнего сервера, он сразу получает статус и заголовки, а вот тело запроса приходит не сразу. Его нужно получить дополнительно. И если библиотека requests делает это за нас, в асинхронном aiohttp мы можем заниматься другими тасками, пока ответ сервера не скачается до конца.

Вы скорее всего задаетесь вопросом: "почему разработчик не углядел этой ошибки"? Дело в том, что в этой функции ему не нужно было обрабатывать сам ответ, было достаточно того, что придет 200 статус. К тому же:
1) IDEшка не подсветила ошибку (мне тоже не подсвечивает)
2) Разработчик забыл проверить ошибочный запрос, который влечет ошибку
3) Ни ruff, ни mypy не видят этой ошибки

👍 - знал об этом
🔥 - не знал
🔥 299
👍 67
10
emoji 7
17 39 10.3K

Обсуждение 17

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram