forked from loafle/openapi-generator-original
Adds basic retries to rest API requests for Python asyncio (#17014)
* Adds basic retries to API requests * This mimics the basic retries performed by urllib3 in the sync version * update samples * Only use retry client if number of retries is specified in the config * Reorganize * Remove class attribute * close retry_client --------- Co-authored-by: William Cheng <wing328hk@gmail.com>
This commit is contained in:
parent
489d369ee7
commit
9970c06f8c
@ -8,11 +8,14 @@ import re
|
||||
import ssl
|
||||
|
||||
import aiohttp
|
||||
import aiohttp_retry
|
||||
|
||||
from {{packageName}}.exceptions import ApiException, ApiValueError
|
||||
|
||||
RESTResponseType = aiohttp.ClientResponse
|
||||
|
||||
ALLOW_RETRY_METHODS = frozenset({'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE'})
|
||||
|
||||
class RESTResponse(io.IOBase):
|
||||
|
||||
def __init__(self, resp) -> None:
|
||||
@ -68,8 +71,24 @@ class RESTClientObject:
|
||||
trust_env=True
|
||||
)
|
||||
|
||||
retries = configuration.retries
|
||||
if retries is not None:
|
||||
self.retry_client = aiohttp_retry.RetryClient(
|
||||
client_session=self.pool_manager,
|
||||
retry_options=aiohttp_retry.ExponentialRetry(
|
||||
attempts=retries,
|
||||
factor=0.0,
|
||||
start_timeout=0.0,
|
||||
max_timeout=120.0
|
||||
)
|
||||
)
|
||||
else:
|
||||
self.retry_client = None
|
||||
|
||||
async def close(self):
|
||||
await self.pool_manager.close()
|
||||
if self.retry_client is not None:
|
||||
await self.retry_client.close()
|
||||
|
||||
async def request(
|
||||
self,
|
||||
@ -168,7 +187,12 @@ class RESTClientObject:
|
||||
declared content type."""
|
||||
raise ApiException(status=0, reason=msg)
|
||||
|
||||
r = await self.pool_manager.request(**args)
|
||||
if self.retry_client is not None and method in ALLOW_RETRY_METHODS:
|
||||
pool_manager = self.retry_client
|
||||
else:
|
||||
pool_manager = self.pool_manager
|
||||
|
||||
r = await pool_manager.request(**args)
|
||||
|
||||
return RESTResponse(r)
|
||||
|
||||
|
@ -16,6 +16,7 @@ urllib3 = ">= 1.25.3"
|
||||
python-dateutil = ">=2.8.2"
|
||||
{{#asyncio}}
|
||||
aiohttp = ">= 3.8.4"
|
||||
aiohttp-retry = ">= 2.8.3"
|
||||
{{/asyncio}}
|
||||
{{#tornado}}
|
||||
tornado = ">=4.2,<5"
|
||||
|
@ -5,6 +5,7 @@ pydantic >= 2
|
||||
typing-extensions >= 4.7.1
|
||||
{{#asyncio}}
|
||||
aiohttp >= 3.0.0
|
||||
aiohttp-retry >= 2.8.3
|
||||
{{/asyncio}}
|
||||
{{#hasHttpSignatureMethods}}
|
||||
pycryptodome >= 3.9.0
|
||||
|
@ -21,6 +21,7 @@ REQUIRES = [
|
||||
"python-dateutil",
|
||||
{{#asyncio}}
|
||||
"aiohttp >= 3.0.0",
|
||||
"aiohttp-retry >= 2.8.3",
|
||||
{{/asyncio}}
|
||||
{{#tornado}}
|
||||
"tornado>=4.2,<5",
|
||||
|
@ -18,11 +18,14 @@ import re
|
||||
import ssl
|
||||
|
||||
import aiohttp
|
||||
import aiohttp_retry
|
||||
|
||||
from petstore_api.exceptions import ApiException, ApiValueError
|
||||
|
||||
RESTResponseType = aiohttp.ClientResponse
|
||||
|
||||
ALLOW_RETRY_METHODS = frozenset({'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE'})
|
||||
|
||||
class RESTResponse(io.IOBase):
|
||||
|
||||
def __init__(self, resp) -> None:
|
||||
@ -78,8 +81,24 @@ class RESTClientObject:
|
||||
trust_env=True
|
||||
)
|
||||
|
||||
retries = configuration.retries
|
||||
if retries is not None:
|
||||
self.retry_client = aiohttp_retry.RetryClient(
|
||||
client_session=self.pool_manager,
|
||||
retry_options=aiohttp_retry.ExponentialRetry(
|
||||
attempts=retries,
|
||||
factor=0.0,
|
||||
start_timeout=0.0,
|
||||
max_timeout=120.0
|
||||
)
|
||||
)
|
||||
else:
|
||||
self.retry_client = None
|
||||
|
||||
async def close(self):
|
||||
await self.pool_manager.close()
|
||||
if self.retry_client is not None:
|
||||
await self.retry_client.close()
|
||||
|
||||
async def request(
|
||||
self,
|
||||
@ -178,7 +197,12 @@ class RESTClientObject:
|
||||
declared content type."""
|
||||
raise ApiException(status=0, reason=msg)
|
||||
|
||||
r = await self.pool_manager.request(**args)
|
||||
if self.retry_client is not None and method in ALLOW_RETRY_METHODS:
|
||||
pool_manager = self.retry_client
|
||||
else:
|
||||
pool_manager = self.pool_manager
|
||||
|
||||
r = await pool_manager.request(**args)
|
||||
|
||||
return RESTResponse(r)
|
||||
|
||||
|
@ -15,6 +15,7 @@ python = "^3.7"
|
||||
urllib3 = ">= 1.25.3"
|
||||
python-dateutil = ">=2.8.2"
|
||||
aiohttp = ">= 3.8.4"
|
||||
aiohttp-retry = ">= 2.8.3"
|
||||
pem = ">= 19.3.0"
|
||||
pycryptodome = ">= 3.9.0"
|
||||
pydantic = ">=2"
|
||||
|
@ -4,4 +4,5 @@ urllib3 >= 1.25.3, < 2.1.0
|
||||
pydantic >= 2
|
||||
typing-extensions >= 4.7.1
|
||||
aiohttp >= 3.0.0
|
||||
aiohttp-retry >= 2.8.3
|
||||
pycryptodome >= 3.9.0
|
||||
|
@ -27,6 +27,7 @@ REQUIRES = [
|
||||
"urllib3 >= 1.25.3, < 2.1.0",
|
||||
"python-dateutil",
|
||||
"aiohttp >= 3.0.0",
|
||||
"aiohttp-retry >= 2.8.3",
|
||||
"pem>=19.3.0",
|
||||
"pycryptodome>=3.9.0",
|
||||
"pydantic >= 2",
|
||||
|
Loading…
x
Reference in New Issue
Block a user