Python Requests包:流式传输时丢失连接

时间:2014-09-16 03:14:24

标签: python streaming python-requests

我想使用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()生成新的数据。但是如果我在等待的时候失去了网络连接呢?如何才能找到,我可以尝试重新连接?

1 个答案:

答案 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_contentsource codes),因此我认为行为相同。过程:运行连接网络的代码。收到一些块后,断开连接。等待2-3秒,重新连接,继续下载。因此请求包DOES重试迭代中的连接丢失。

注意:如果构建连接(requests.get())时没有网络,则引发ConnectionError;如果网络在iter_lines / iter_content中丢失,则会引发socket.timeout。