Почему aiohttp нужно ждать, чтобы получить тело? - PullRequest
1 голос
/ 20 февраля 2020

Я нашел aiohttp сервер должен использовать ключевое слово await для получения тела запроса

async def handler(request):
  body = await request.json(). # or text(), read()

Я думаю, что при вызове handler тело запроса уже находится в памяти на стороне сервера, и я не не думаю, что это интенсивная работа ввода-вывода, требующая асинхронной операции.

Есть ли пропущенные точки?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

С очень большим телом сообщения запроса вы, возможно, не получили полное тело, когда вызывается handler. HTTP1 / 1 утверждает, что сервер может ответить до конца запроса (из RF C 2616):

Клиент HTTP / 1.1 (или более поздней версии), отправляющий тело сообщения, ДОЛЖЕН контролировать сетевое соединение для статуса ошибки во время передачи запроса. Если клиент видит состояние ошибки, он ДОЛЖЕН немедленно прекратить передачу тела.

Таким образом, вы можете, например, сразу же ответить кодом ошибки клиента 4xx, если вы не принимаете запрос (например, ). 401 Несанкционированный (если токен недействителен) до получения всего тела сообщения запроса.

2 голосов
/ 20 февраля 2020

Наоборот, их нет в памяти. Цитирование документации :

Хотя методы read (), json () и text () очень удобны, их следует использовать осторожно. Все эти методы загружают весь ответ в память. Например, если вы хотите загрузить несколько файлов размером в гигабайт, эти методы загрузят все данные в память. Вместо этого вы можете использовать атрибут содержимого.

Также см. Другой ответ для внутренней работы протокола HTTP.

...