python请求库,如何在python请求库中实现重试机制?

I would like to add a retry mechanism to python request library, so scripts that are using it will retry for non fatal errors.

At this moment I do consider three kind of errors to be recoverable:

HTTP return codes 502, 503, 504

host not found (less important now)

request timeout

At the first stage I do want to retry specified 5xx requests every minute.

I want to be able to add this functionality transparently, without having to manually implement recovery for each HTTP call made from inside these scripts or libraries that are using python-requests.

解决方案

I was able to obtain the desired level of reliability by extending requests.Session class.

EDIT That code was:

from requests import Session

from requests.exceptions import ConnectionError

import logging

import time

class ResilientSession(Session):

"""

This class is supposed to retry requests that do return temporary errors.

At this moment it supports: 502, 503, 504

"""

def __recoverable(self, error, url, request, counter=1):

if hasattr(error,'status_code'):

if error.status_code in [502, 503, 504]:

error = "HTTP %s" % error.status_code

else:

return False

DELAY = 10 * counter

logging.warn("Got recoverable error [%s] from %s %s, retry #%s in %ss" % (error, request, url, counter, DELAY))

time.sleep(DELAY)

return True

def get(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).get(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'GET', counter):

continue

return r

def post(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).post(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'POST', counter):

continue

return r

def delete(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).delete(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'DELETE', counter):

continue

return r

def put(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).put(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'PUT', counter):

continue

return r

def head(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).head(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'HEAD', counter):

continue

return r

def patch(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).patch(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'PATCH', counter):

continue

return r

def options(self, url, **kwargs):

counter = 0

while True:

counter += 1

try:

r = super(ResilientSession, self).options(url, **kwargs)

except ConnectionError as e:

r = e.message

if self.__recoverable(r, url, 'OPTIONS', counter):

continue

return r

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值