web-dev-qa-db-ja.com

Python Requests-ChunkedEncodingError(e)-requests.iter_lines

Pythonリクエストを使用してChunkedEncodingError(e)を取得しています。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がないことを確認しますか?そのように私はNoneTypeiter_linesしようとしないで、それは爆破しますか?

6
HectorOfTroy407

ChunkedEncodingErrorの原因:httplib.IncompletedRead

enter image description here

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がエラーを発生させ、貴重なバイトを埋めます。

6
gushitong

私がここに投稿したように、別の人 IncompleteRead が言及しているので、「With」句を使用して、前のリクエストが閉じていることを確認できます。

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