自定义Retry类设置BACKOFF_MAX时遇参数缺失异常的解决求助
解决方案
核心思路
urllib3 的 Retry.new() 方法在生成新实例时,仅会传递其内置的参数,不会自动包含你自定义的 backoff_max。因此需要在自定义的 RetryRequest 类中重写 new() 方法,主动将该参数传递给新实例。
代码实现
重写自定义重试类
from urllib3.util.retry import Retry class RetryRequest(Retry): def __init__(self, backoff_max, *args, **kwargs): self.backoff_max = backoff_max super().__init__(*args, **kwargs) def new(self, **kwargs): # 将当前实例的 backoff_max 注入新实例参数 kwargs['backoff_max'] = self.backoff_max return super().new(**kwargs)
会话创建逻辑保持不变
import requests from requests.adapters import HTTPAdapter def create_session(backoff_max, retries=3, status_forcelist=(500, 502, 504)): session = requests.Session() retry_strategy = RetryRequest( backoff_max=backoff_max, total=retries, status_forcelist=status_forcelist, allowed_methods=["GET", "POST"] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) return session
原理说明
当 urllib3 在重试流程中调用 retries.increment() 时,会触发 new() 方法生成新的重试实例。重写后的 new() 方法会主动把当前实例的 backoff_max 加入参数列表,确保新实例初始化时不会缺失该必填参数,同时无需为 backoff_max 设置默认值。
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

