Google App Engine /请求频繁出现ChunkedEncodingError

时间:2016-05-06 09:54:25

标签: python google-app-engine python-requests

在使用ChunkedEncodingError(Python)和Google App Engine请求服务器时,我经常有Requests

我查看了IncompleteRead using httplib的答案,但问题是我不相信我的问题与查询服务器有关:我经常会在我使用的各个端点上收到此错误,包括Intercom和FullContact。

如果问题总是来自同一台服务器(例如,FullContact),我会怀疑这个问题与一个服务的服务器有关,但事实并非如此。我还遇到了其他非相关请求的问题。

因此,我怀疑问题不在于我的代码还是Google。但是根据我的代码"观点",我不知道会出现什么问题。这是一个片段:

result = requests.post(
    "https://api.intercom.io/companies",
    json={'some': 'data', 'that': 'are', 'sent': 'ok'},
    headers={'Accept': 'application/json'},
    auth=("app_id", "app_key",)
)

正如您所看到的,请求非常标准,没什么特别的。它也失败了一些简单的事情:

r = requests.get(url, params=params, timeout=3)

有没有人在使用Google App Engine时遇到这些问题?我能做些什么来避免这种情况吗?

1 个答案:

答案 0 :(得分:6)

有一个补丁(似乎)可以在GAE上运行。 该问题位于请求的iter_content函数中,该函数使用后续的urllib3库。

问题在于Google会为自己的实现覆盖此库,但会有一些更改会导致Requests级别的ChunkedEncodingError。

我试过了this patch,到目前为止,这么好。具体来说,您必须在requests / models.py文件中替换以下行:

for chunk in self.raw.stream(chunk_size, decode_content=True):
    yield chunk

by:

if isinstance(self.raw._original_response._method, int):
    while True:
        chunk = self.raw.read(chunk_size, decode_content=True)
        if not chunk:
            break
        yield chunk
else:
    for chunk in self.raw.stream(chunk_size, decode_content=True):
        yield chunk

问题将会停止。

submitted an issue在Requests存储库中讨论它,我们将看到它将如何发展。