Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果请求失败并带有代码,请重试类方法_Python_Amazon Web Services_Python Requests_Boto3 - Fatal编程技术网

Python 如果请求失败并带有代码,请重试类方法

Python 如果请求失败并带有代码,请重试类方法,python,amazon-web-services,python-requests,boto3,Python,Amazon Web Services,Python Requests,Boto3,我有一个Python类,它通过boto3和requests库向AWS发送有效负载。但是,有时http请求会因各种代码而失败,因此我想在类中编写一个包装函数,如果得到某些代码,它将重试发送有效负载5次,如果完全失败,则引发异常。下面是类方法(假设方法调用按预期工作): 有时此api调用将失败,状态为504。我想围绕这个类方法编写一个wrapper retry方法,默认情况下,在每次尝试之间会重试5次,等待时间为retry^2,如果代码200成功,则退出循环 我发现这段代码似乎与我将要使用的代码大致

我有一个Python类,它通过
boto3
requests
库向AWS发送有效负载。但是,有时http请求会因各种代码而失败,因此我想在类中编写一个包装函数,如果得到某些代码,它将重试发送有效负载5次,如果完全失败,则引发异常。下面是类方法(假设方法调用按预期工作):

有时此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

上述代码的问题是,它正在使用
请求.session
并返回它,而我的类已经在使用
boto3.session
。任何帮助都将不胜感激

我想试试这样的东西:

导入时间
导入请求
从functools导入包装
导入日志记录
logging.basicConfig(级别=logging.DEBUG)
def重试(延迟=10,重试=4):
def retry_装饰器(f):
@包装(f)
def f_重试(*args,**kwargs):
opt_dict={'retries':重试,'delay':delay}
而opt_dict['retries']>1:
尝试:
返回f(*args,**kwargs)
例外情况除外,如e:
msg=“异常:{},在{}秒内重试…”。格式(e,延迟)
打印(msg)
睡眠时间(opt_dict['delay'])
opt_dict['retries']-=1
返回f(*args,**kwargs)
返回f_重试
返回重试修饰符
你的班级:
#只是为了证明概念
url='您的url'
状态='您的状态'
def签名请求(自我):
返回“”
主机='您的主机'
区域='您的区域'
服务='您的服务'
#模拟端
def更新_状态(自身、状态):
有效载荷=状态
auth=self.sign\u请求()
@重试(1,5)
def get_状态():
response=requests.patch(self.url,auth=auth,data=payload)
如果没有响应。确定:
logging.error(“更新请求状态失败:”+str(
{'host':self.host,'region':self.region,
'service':self.service,'url':self.url,'status':str(status)})
raise IOError('更新培训状态失败,状态代码:'+str(response.status_code)+'\n'+response.text)
返回响应
res=获取_状态()
状态代码=恢复状态代码
回复文本=回复文本
logging.info(“更新状态”)
x=YourClass()
x、 url='1〕https://httpstat.us/200'
x、 更新_状态(“”)
x、 url='1〕https://httpstat.us/504'
x、 更新_状态(“”)

当然,您可能需要根据自己的需要进行调整

为什么不使用这样一个简单的装饰器:?为了使这个装饰器工作,我必须从函数返回什么?
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