как повторить асинхронные запросы aiohttp в зависимости от кода состояния - PullRequest
2 голосов
/ 15 мая 2019

Я использую API, и иногда он дает некоторые странные коды состояния, которые можно исправить, просто повторив тот же запрос.Я использую aiohttp, чтобы делать запросы к этому API асинхронно

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

   @backoff.on_exception(backoff.expo, aiohttp.ClientError, max_tries=11, max_time=60)
    async def get_user_timeline(self, session, user_id, count, max_id, trim_user, include_rts, tweet_mode):

        params = {
            'user_id': user_id,
            'trim_user': trim_user,
            'include_rts': include_rts,
            'tweet_mode': tweet_mode,
            'count': count
        }


        if (max_id and max_id != -1):
            params.update({'max_id': max_id})

        headers = {
            'Authorization': 'Bearer {}'.format(self.access_token)    
        }

        users_lookup_url = "/1.1/statuses/user_timeline.json"

        url = self.base_url + users_lookup_url

        async with session.get(url, params=params, headers=headers) as response:
            result = await response.json()
            response = {
                'result': result,
                'status': response.status,
                'headers': response.headers
            }
            return response

Я хотел бы, чтобы все запросы отклонялись до 10 раз, если ответ имеет код состояния, отличный от 200 или 429.

1 Ответ

2 голосов
/ 15 мая 2019

По умолчанию aiohttp не вызывает исключение для статуса не-200. Вы должны изменить его, передавая raise_for_status=True ( doc ):

async with session.get(url, params=params, headers=headers, raise_for_status=True) as response:

Он должен вызывать исключение для любых статусов 400 и выше и, таким образом, вызывать backoff.

Коды 2xx, вероятно, не следует повторять, поскольку эти не являются ошибками .


В любом случае, если вы все-таки хотите повысить рейз до «кроме 200 или 429», вы можете сделать это вручную:

if response.status not in (200, 429,):
     raise aiohttp.ClientResponseError()
...