我已经使用^{requests
会话的重试机制,正如建议的here和{a3}。在
现在,我正在尝试找出添加回调函数的最佳方法,该函数将在每次重试尝试时被调用。在
为了更详细地解释我自己,如果Retry
对象或requestsget
方法都能添加回调函数,那就太好了。可能是这样的:
import requests
from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
def retry_callback(url):
print url
s = requests.Session()
retries = Retry(total=5, status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
url = 'http://httpstat.us/500'
s.get(url, callback=retry_callback, callback_params=[url])
我知道对于打印url,我可以使用日志记录,但这只是一个简单的例子,用于更复杂的用途。
请原谅,如果这不是最好的python编码,但我希望它足够清楚。在
谢谢。在
您可以将
Retry
类的子类化以添加该功能。在这是给定连接尝试中与
Retry
实例的完整交互流:Retry.is_retry()
方法返回true时,将使用当前方法、url、响应对象(如果有)和异常(如果引发了一个)调用{.increment()
将重新引发错误(如果有),并且该对象被配置为不重试该特定类别的错误。在.increment()
调用Retry.new()
创建一个更新的实例,更新任何相关的计数器,并用新的^{Retry.new()
的返回值调用.increment()
为true,则{MaxRetryError
异常。is_exhausted()
当它跟踪的任何计数器低于0时返回true(忽略设置为None
的计数器)。在.increment()
返回新的Retry
实例。在Retry.increment()
的返回值将替换跟踪的旧的Retry
实例。如果有重定向,则调用Retry.sleep_for_retry()
(如果存在Retry-After
头,则为休眠),否则调用Retry.sleep()
(调用self.sleep_for_retry()
以遵守Retry-After
头,否则只在有退避策略时休眠)。然后使用新的Retry
实例进行递归连接调用。在这为您提供了3个好的回调点:在}周围的上下文管理器中,允许回调否决异常或在退出时更新返回的重试策略。在
.increment()
开始时,在创建新的Retry
实例时,以及在{将钩子放在
.increment()
的开头是这样的:注意,
url
参数实际上只是URL path,请求的net location部分被省略了(您必须从_pool
参数中提取它,它有.scheme
、.host
和.port
属性)。在演示:
^{pr2}$在
.new()
方法中放置一个钩子可以让您为下一次尝试调整策略,也可以让您反思.history
属性,但不能避免异常重新引发。在相关问题 更多 >
编程相关推荐