Почему я должен ждать response.read (), но мне не нужно ждать response.status? - PullRequest
1 голос
/ 14 марта 2020

Я не понимаю, как работают асинхронные запросы. Здесь у меня есть функция, которая отправляет изображение с помощью запроса POST:

async def post_img(in_url, in_filepath, in_filename):
with open(in_filepath, 'rb') as file:
    in_files = {'file': file}
    async with ClientSession() as session:
        async with session.post(in_url, data=in_files) as response:
            status = response.status
            response = await response.read()
            print(response)

Почему я могу прочитать статус ответа, не ожидая его? Как я могу сказать, что запрос выполнен, если я не жду его до конца? 1005 *?

1 Ответ

2 голосов
/ 14 марта 2020

Почему я могу прочитать статус ответа, не ожидая его?

Поскольку вы уже ожидали его неявно, когда писали async with session.post(...). async with session.post(...) as response читает ответ header и предоставляет его данные в объекте response. Код состояния прибывает в самое начало ответа и доступен для любого правильного ответа.

Вы должны дождаться ответа body , используя await response.read(), поскольку содержимое тела не является частью объекта запроса. Поскольку тело может иметь произвольный размер, его автоматическое считывание может занять слишком много времени и исчерпать доступную память.

...