web-dev-qa-db-ja.com

ステータスコードに応じて非同期aiohttpリクエストを再試行する方法

私は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

応答のステータスコードが200または429以外の場合、すべてのリクエストを最大10回まで廃棄してください。

5
Kay

私はあなたを助けることができる簡単なライブラリを作りました:
https://github.com/inyutin/aiohttp_retry

このようなコードはあなたの問題を解決するはずです:

from aiohttp import ClientSession
from aiohttp_retry import RetryClient

statuses = {x for x in range(100, 600)}
statuses.remove(200)
statuses.remove(429)

async with ClientSession() as client:
    retry_client = RetryClient(client)
    async with retry_client.get("https://google.com", retry_attempts=10, retry_for_statuses=statuses) as response:
        text = await response.text()
        print(text)
    await retry_client.close()

代わりにgoogle.com独自のurlを使用する

1
inyutin