6

django を使用して内部 http サービスに接続したいのですが、一部のコンテンツが非常に大きいため、これらのサービスの http 応答の出力をバッファリングする必要があります。

私はpython 3.6、django 2.0、http.clientおよび次のコードを使用しています:

class HTTPStreamIterAndClose():
    def __init__(self, conn, res, buffsize):
        self.conn = conn
        self.res = res
        self.buffsize = buffsize
        self.length = 1

        bytes_length = int(res.getheader('Content-Length'))

        if buffsize < bytes_length:
            self.length = math.ceil(bytes_length/buffsize)

    def __iter__(self):
        return self

    def __next__(self):
        buff = self.res.read(self.buffsize)

        if buff is b'':
            self.res.close()
            self.conn.close()

            raise StopIteration
        else:

            return buff

    def __len__(self):
        return self.length


def passthru_http_service(request, server, timeout, path):
    serv = HTTPService(server, timeout)
    res = serv.request(path)

    response = StreamingHttpResponse(
        HTTPStreamIterAndClose(serv.connection, res, 200),
        content_type='application/json'
    )
    response['Content-Length'] = res.getheader('Content-Length')

    return response

応答は空です。イテレータを次のようにテストします。

b''.join(HTTPStreamIterAndClose(serv.connection, res, 200)

そして、すべてが正常に機能します。なぜ機能しないのかわかりません。

4

2 に答える 2