我想使用Requests包连接到Web服务的流API。假设我使用以下代码发送请求,接收响应并在响应时迭代响应行:
import requests
r = requests.get('http://httpbin.org/stream/20', stream=True)
for line in r.iter_lines():
if line:
print line
在等待接收新数据的同时,我们基本上在等待r.iter_lines()生成新的数据。但是如果我在等待的时候失去了网络连接呢?如何才能找到,我可以尝试重新连接?
答案 0 :(得分:1)
您可以与网络断开连接以尝试。请求引发此类错误:
requests.exceptions.ConnectionError:HTTPConnectionPool(host =' httpbin.org',port = 80):使用url:/ stream / 20超出最大重试次数(由以下错误引起:[Errno -3]暂时失败在名称解析中)
错误消息显示请求已重试网络错误。您可以参考此answer来设置max_retries。如果您想要更多自定义(例如重试之间的等待),请在循环中执行:
import socket
import requests
import time
MAX_RETRIES = 2
WAIT_SECONDS = 5
for i in range(MAX_RETRIES):
try:
r = requests.get('http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-desktop-amd64.iso',
stream=True, timeout=10)
idx = 1
for chunk in r.iter_content(chunk_size=1024):
if chunk:
print 'Chunk %d received' % idx
idx += 1
break
except requests.exceptions.ConnectionError:
print 'build http connection failed'
except socket.timeout:
print 'download failed'
time.sleep(WAIT_SECONDS)
else:
print 'all tries failed'
编辑:我测试了一个大文件。我使用iter_content
代替,因为它是一个二进制文件。 iter_lines
基于iter_content
(source codes),因此我认为行为相同。过程:运行连接网络的代码。收到一些块后,断开连接。等待2-3秒,重新连接,继续下载。因此请求包DOES重试迭代中的连接丢失。
注意:如果构建连接(requests.get()
)时没有网络,则引发ConnectionError;如果网络在iter_lines
/ iter_content
中丢失,则会引发socket.timeout。