您可以尝试设置
stream=True,然后在读取数据块时超出时间或大小限制时中止请求。
从
requests版本2.3.0开始,超时也适用于流请求,因此您需要做的就是允许初始连接和每个迭代步骤都超时:
r = requests.get(..., stream=True, timeout=initial_timeout)r.raise_for_status()if int(r.headers.get('Content-Length')) > your_maximum: raise ValueError('response too large')size = 0start = time.time()for chunk in r.iter_content(1024): if time.time() - start > receive_timeout: raise ValueError('timeout reached') size += len(chunk) if size > your_maximum: raise ValueError('response too large') # do something with chunk
根据需要调整超时时间。
对于
requests版本低于2.3.0(包括此更改)的版本,您无法超时
r.iter_content()。在块中间停止响应的服务器仍会占用连接。您必须将以上代码包装在其他超时功能中,以尽早切断长时间运行的响应。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)