Simple retry cient for aiohttp
Project description
Simple aiohttp retry client
Python 3.6 or higher.
Install: pip install aiohttp-retry.
Warning
This current version is 2.0+. It hasn't backward compatibility for previous versions.
You still can use v1.2 (pip install aiohttp-retry==1.2), but it is unsupported.
Examples of usage:
from aiohttp_retry import RetryClient, ExponentialRetry
async def main():
retry_options = ExponentialRetry(attempts=1)
retry_client = RetryClient(raise_for_status=False, retry_options=retry_options)
async with retry_client.get('https://ya.ru') as response:
print(response.status)
await retry_client.close()
from aiohttp_retry import RetryClient, RandomRetry
async def main():
retry_options = RandomRetry(attempts=1)
retry_client = RetryClient(raise_for_status=False, retry_options=retry_options)
response = await retry_client.get('/ping')
print(response.status)
await retry_client.close()
from aiohttp_retry import RetryClient
async def main():
async with RetryClient() as client:
async with client.get('https://ya.ru') as response:
print(response.status)
You can also add some logic, F.E. logging, on failures by using trace mechanic.
import logging
import sys
from types import SimpleNamespace
from aiohttp import ClientSession, TraceConfig, TraceRequestStartParams
from aiohttp_retry import RetryClient, ExponentialRetry
handler = logging.StreamHandler(sys.stdout)
logging.basicConfig(handlers=[handler])
logger = logging.getLogger(__name__)
retry_options = ExponentialRetry(attempts=2)
async def on_request_start(
session: ClientSession,
trace_config_ctx: SimpleNamespace,
params: TraceRequestStartParams,
) -> None:
current_attempt = trace_config_ctx.trace_request_ctx['current_attempt']
if retry_options.attempts <= current_attempt:
logger.warning('Wow! We are in last attempt')
async def main():
trace_config = TraceConfig()
trace_config.on_request_start.append(on_request_start)
retry_client = RetryClient(retry_options=retry_options, trace_configs=[trace_config])
response = await retry_client.get('https://httpstat.us/503', ssl=False)
print(response.status)
await retry_client.close()
Look tests for more examples.
Be aware: last request returns as it is.
Documentation
RetryClient takes the same arguments as ClientSession[docs]
RetryClient has methods:
- get
- options
- head
- post
- put
- patch
- put
- delete
They are same as for ClientSession, but take one possible additional argument:
class RetryOptionsBase:
def __init__(
self,
attempts: int = 3, # How many times we should retry
statuses: Optional[Iterable[int]] = None, # On which statuses we should retry
exceptions: Optional[Iterable[Type[Exception]]] = None, # On which exceptions we should retry
):
...
@abc.abstractmethod
def get_timeout(self, attempt: int) -> float:
raise NotImplementedError
You can specify RetryOptions both for RetryClient and it's methods.
RetryOptions in methods override RetryOptions defined in RetryClient constructor.
You can define your own timeouts logic or use:
ExponentialRetrywith exponential backoffRandomRetryfor random backoffListRetrywith backoff you predefine by list
Request Trace Context
RetryClient add current attempt number to request_trace_ctx (see examples,
for more info see aiohttp doc).
Change URL between retries
You can change URL between retries by specifying url as list of urls. Example:
from aiohttp_retry import RetryClient
retry_client = RetryClient()
async with retry_client.get(url=['/internal_error', '/ping']) as response:
text = await response.text()
assert response.status == 200
assert text == 'Ok!'
await retry_client.close()
In this example we request /interval_error, fail and then successfully request /ping.
If you specify less urls than attempts number in RetryOptions, RetryClient will request last url at last attempts.
This means that in example above we would request /ping once again in case of failure.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aiohttp_retry-2.3.2.tar.gz.
File metadata
- Download URL: aiohttp_retry-2.3.2.tar.gz
- Upload date:
- Size: 5.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8309448d26707ce3ea318f31a4920f40ac9778c4923c09faf2154600d8d37362
|
|
| MD5 |
6850b37c4177586e5ab2a43c037f29da
|
|
| BLAKE2b-256 |
1f6f5aaed1cf84cf7bfca93c287d94c015685f6669cba55e9900317b6efc049d
|
File details
Details for the file aiohttp_retry-2.3.2-py3-none-any.whl.
File metadata
- Download URL: aiohttp_retry-2.3.2-py3-none-any.whl
- Upload date:
- Size: 6.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
981d5e644a527347c9d4e4278ddf0d7922aa033bc8215c64a8d892f261bb4b30
|
|
| MD5 |
a26692d8651aa61f520731d45aa4afb4
|
|
| BLAKE2b-256 |
0147e2310f26d8af2d811fef5dcf0db248bcd9a1bb8ff8043c507bdc14de6dd9
|