我有一个Python类,它用boto3
和requests
库向AWS发送有效负载。但是,有时http请求会失败,并产生各种代码,因此我想在类中编写一个包装器函数,如果得到某些代码,它将重试发送有效负载5次,如果完全失败,则引发异常。下面是类方法(假设方法调用按预期工作):
import requests
from boto3 import Session
def update_status(self, status):
payload = status
auth = self.sign_request()
response = requests.patch(self.url, auth=auth, data=payload)
status_code = response.status_code
response_text = response.text
if not response.ok:
logging.error("Failed updating status of request: " + str(
{'host': self.host, 'region': self.region,
'service': self.service, 'url': self.url, 'status': str(status)}))
raise IOError('Update training status failed with status code: ' + str(status_code) + '\n' + response_text)
logging.info("Updated status")
有时此api调用将失败,状态为504
。我想围绕这个类方法编写一个wrapper retry方法,默认情况下,在每次尝试之间重试5次,等待时间为retry^2
,如果代码200
成功,则退出循环。你知道吗
我发现这段代码似乎与我将要使用的代码大致相同,我只是不知道如何将我当前的方法包装在其中并调用它:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
def requests_retry_session(
retries=5,
backoff_factor=0.3,
status_forcelist=(500, 502, 504),
session=None,
):
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
上面代码的问题是它正在使用requests.session
并在我的类已经在使用boto3.Session
时返回它。任何帮助都将不胜感激!你知道吗
我会尝试这样的方法:
当然,你可以根据自己的需要来调整它。你知道吗
相关问题 更多 >
编程相关推荐