首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Iterable对象和Django StreamingHttpResponse

Iterable对象和Django StreamingHttpResponse
EN

Stack Overflow用户
提问于 2017-12-29 06:12:54
回答 2查看 1.4K关注 0票数 6

我想用django连接到内部的http服务,我需要缓冲这些服务的http响应的输出,因为有些内容非常大。

我使用的是Python3.6、Django2.0、http.client和以下代码:

代码语言:javascript
复制
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

如果响应为空,则使用以下命令测试迭代器:

代码语言:javascript
复制
b''.join(HTTPStreamIterAndClose(serv.connection, res, 200)

一切都很好,我不知道为什么不工作。

EN

回答 2

Stack Overflow用户

发布于 2018-01-05 21:56:28

https://andrewbrookins.com/django/how-does-djangos-streaminghttpresponse-work-exactly/

首先,一些条件必须为真:

  • 客户端必须使用HTTP/1.1或更新的
  • 请求方法不是304

响应不包括HEAD

  • The标头

  • 响应状态不是204304

如果这些条件为真,那么Gunicorn将向响应添加一个Transfer-Encoding: chunked标头,向客户端发出响应将以块为单位进行流式传输的信号。

事实上,即使你使用了HttpResponse,Gunicorn也会响应Transfer-Encoding: chunked,如果这些条件成立的话!

要真正流式传输响应,也就是将其分片发送到客户端,条件必须为真,并且您的响应需要是具有多个项的迭代器。

基本上,你需要决定:流媒体还是Content-Length

如果你想恢复下载,使用Range

票数 4
EN

Stack Overflow用户

发布于 2018-01-16 05:35:47

最后,问题是http请求在一段时间后断开,这就是为什么当我在连接之后和创建对象之前立即迭代时find,而不是当我在响应之后使用时,但当我在开始迭代时启动连接时,一切都完美地工作=/。

干杯。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48015016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档