如何子类化requests.Session实现请求数达标后自动重启会话
问题核心
你原来的代码问题在于:方法内对self直接赋值仅会修改当前作用域的局部变量,不会影响外部持有的原有实例对象,自然也无法同步更新实例属性状态。
解决方案
不需要创建新的Session实例,直接重置当前实例的所有会话状态即可,同时我们可以把计数逻辑放到更底层的request方法中,适配所有HTTP请求类型,不用单独重写get/post等每个方法。
修正后的完整代码:
import requests import time class Session(requests.Session): # 请求计数阈值,可按需调整 request_count_limit = 50 # 重置会话后的休眠时间,可按需调整 restart_sleep_time = 30 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.request_count = 0 def request(self, method, url, **kwargs): # 达到阈值时重置当前会话 if self.request_count >= self.request_count_limit: print(f'请求数达到阈值,重置会话,休眠{self.restart_sleep_time}秒...') time.sleep(self.restart_sleep_time) # 重新初始化父类,清空cookies、连接池等所有会话状态,和新建实例效果一致 super().__init__() # 重置计数器 self.request_count = 0 response = super().request(method, url, **kwargs) self.request_count += 1 return response
使用方法
和原生requests.Session完全一致,直接实例化调用即可,自动处理计数、重置、休眠逻辑:
s = Session() resp = s.get("https://example.com") # 后续所有get/post/put等请求都会自动触发限流逻辑
内容的提问来源于stack exchange,提问作者tedzz
相关产品推荐
相关产品推荐

