Python 请求 - ChunkedEncodingError(e) - requests.iter_lines

新手上路,请多包涵

我得到一个 ChunkedEncodingError(e) 使用 Python 请求。我正在使用以下内容来删除 JSON:

 r = requests.get(url, headers=auth, stream=True)

并迭代每一行,使用回车符作为分隔符,这就是此 API 区分不同 JSON 事件的方式。

 for d in r.iter_lines(delimiter="\n"):
    d += "\n"
    sock.send(d)

我在回车符上定界,然后将其添加回作为端点,我将日志推送到实际上期望在每个事件结束时也有回车符。这似乎适用于大约 100k 的日志文件。当我尝试打一个更大的电话时,我会抛出以下内容:

 for d in r.iter_lines(delimiter="\n"):
logs_1           |   File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 783, in iter_lines
logs_1           |     for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
logs_1           |   File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 742, in generate
logs_1           |     raise ChunkedEncodingError(e)
logs_1           | requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

更新:我发现 API 也在某些时候发回 NoneType 。那么我如何在不破坏所有内容的情况下在响应中的某个地方解释这个空字节呢?每个单独的事件都以 \n 结束,我需要能够单独检查每个事件。我应该分块内容而不是 iter_lines 吗?然后确保块中没有 NoneType ?这样我就不会尝试 iter_lines 超过 NoneType 它爆炸了?

原文由 HectorOfTroy407 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

ChunkedEncodingError 由以下原因引起: httplib.IncompletedRead

在此处输入图像描述

 import httplib

def patch_http_response_read(func):
    def inner(*args):
        try:
            return func(*args)
        except httplib.IncompleteRead, e:
            return e.partial
    return inner

httplib.HTTPResponse.read = patch_http_response_read(httplib.HTTPResponse.read)

我认为这可能是一个补丁。它允许您处理有缺陷的 http 服务器。

大多数服务器传输所有数据,但由于实施错误,它们错误地关闭会话和 httplib 引发错误并掩埋您宝贵的字节。

原文由 gushitong 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如我在这里发布的另一个人 IncompleteRead 提到的那样,您可以使用“With”子句来确保您之前的请求已关闭。

  with requests.request("POST", url_base, json=task, headers=headers) as report:
    print('report: ', report)

原文由 Bordotti 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题