Преобразование запросов python в aiohttp и добавление к нему обработки ошибок

avatar
knowledge_seeker
8 августа 2021 в 19:38
212
1
0

Этот код был моим синхронным кодом, использующим библиотеку запросов Python:


    def request_with_error_handling(self, item_id):
        browse_url = f'https://api.ebay.com/buy/browse/v1/item/v1|{item_id}|0'
        while True:
            try:
                rq = requests.get(browse_url, headers=self.browse_headers)
                break
            except Exception as e:
                print(f'An error has occurred while processing the request: {str(e)}')
                t.sleep(1)

        return rq

Если я получаю сообщение об ошибке при установлении соединения, я жду секунду и пытаюсь снова, но если все идет хорошо, я выхожу из цикла и возвращаю ответ.

Однако, когда я пытаюсь сделать это с помощью aiohttp:

    async def request_with_error_handling(self, browse_url):
        async with aiohttp.ClientSession() as session:
            while True:
                try:
                    async with session.get(browse_url, headers=self.browse_headers) as response:
                    break
                except Exception as e:
                    print(
                        f'An error has occurred while processing the request: {str(e)}')
                    t.sleep(1)

        return response

в моей среде IDE отображается красная зигзагообразная линия и сообщается следующее:

Оператор break break_stmt ::= "перерыв" break может возникать только синтаксически вложенным в цикл for или while, но не вложенным в определение функции или класса в этом цикле. Он завершает ближайший охватывающий цикл, пропуская необязательное предложение else, если оно есть в цикле. Если цикл for завершается разрывом, цель управления циклом сохраняет свое текущее значение. Когда break передает управление оператору try с предложением finally, это предложение finally выполняется перед тем, как выйти из цикла.

Как преобразовать ту же логику, что и с запросами, в код aiohttp?

Источник

Ответы (1)

avatar
Booboo
8 августа 2021 в 20:23
1

Я предполагаю, что ваш отступ отражает тот факт, что вы воспроизводите метод внутри класса. В любом случае, вам нужно добавить отступ break:

.
    async def request_with_error_handling(self, browse_url):
        async with aiohttp.ClientSession() as session:
            while True:
                try:
                    async with session.get(browse_url, headers=self.browse_headers) as response:
                        break
                except Exception as e:
                    print(
                        f'An error has occurred while processing the request: {str(e)}')
                    t.sleep(1)

        return response