为何requests.get设置stream=False无法获取对等端IP与端口?
为什么requests.get中stream=False时无法获取对等端IP和端口?
这本质是Requests基于资源回收和内存优化的设计逻辑导致的:
- 当
stream=False时,Requests会自动把整个响应体下载到内存,完成后立即关闭底层HTTP连接(包括socket),并将rsp.raw._connection置为None——这样做是为了及时释放网络资源,避免闲置连接占用系统资源。 - 当
stream=True时,Requests会保持连接打开状态,允许你按需分块读取响应体,此时底层连接对象(含socket)会被保留,因此能通过getpeername()获取对等端的IP和端口。
需要注意:直接访问rsp.raw._connection这类私有属性(以下划线开头)属于非官方用法,后续版本可能存在兼容性问题。如果需要稳定获取对等端信息,可考虑两种替代方案:
- 请求前通过DNS解析主机名拿到IP,但这种方式无法处理CDN或负载均衡场景下实际连接的节点IP;
- 使用自定义传输适配器捕获连接信息。
你的测试代码也验证了这一逻辑:stream=False时连接已被回收,_connection变为None,自然无法获取socket相关信息。
内容的提问来源于stack exchange,提问作者nathannnnn
相关产品推荐
相关产品推荐

