Проводил недавно код-ревью и обратил внимание на этот участок кода (см. скрин).
Я сразу увидел грубую ошибку. Попробуйте найти ее, и потом открывайте спойлер 👇
Проблема в коде resp.json(). Многие (как и я) привыкли пользоваться синхронной библиотекой requests и при переходе на aiohttp по привычке пытаются получить данные синхронно.
Правильно писать await resp.json(). Это сперва может показаться контринтуитивно. Ведь можно получить resp.status (http код ответа) и resp.headers (заголовки) синхронно...
Что происходит на самом деле? Когда наш бэкенд получает ответ от внешнего сервера, он сразу получает статус и заголовки, а вот тело запроса приходит не сразу. Его нужно получить дополнительно. И если библиотека requests делает это за нас, в асинхронном aiohttp мы можем заниматься другими тасками, пока ответ сервера не скачается до конца.
Вы скорее всего задаетесь вопросом: "почему разработчик не углядел этой ошибки"? Дело в том, что в этой функции ему не нужно было обрабатывать сам ответ, было достаточно того, что придет 200 статус. К тому же:
1) IDEшка не подсветила ошибку (мне тоже не подсвечивает)
2) Разработчик забыл проверить ошибочный запрос, который влечет ошибку
3) Ни ruff, ни mypy не видят этой ошибки
👍 - знал об этом
🔥 - не знал
🔥299
👍67
❤10
7
17 39 10.3K
Обсуждение
17
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсуждение 17
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram