我想用django连接到内部的http服务,我需要缓冲这些服务的http响应的输出,因为有些内容非常大。
我使用的是Python3.6、Django2.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)一切都很好,我不知道为什么不工作。
发布于 2018-01-05 21:56:28
https://andrewbrookins.com/django/how-does-djangos-streaminghttpresponse-work-exactly/
首先,一些条件必须为真:
HTTP/1.1或更新的304响应不包括HEAD
204或304如果这些条件为真,那么Gunicorn将向响应添加一个
Transfer-Encoding: chunked标头,向客户端发出响应将以块为单位进行流式传输的信号。
事实上,即使你使用了HttpResponse,Gunicorn也会响应Transfer-Encoding: chunked,如果这些条件成立的话!
要真正流式传输响应,也就是将其分片发送到客户端,条件必须为真,并且您的响应需要是具有多个项的迭代器。
基本上,你需要决定:流媒体还是Content-Length。
如果你想恢复下载,使用Range。
发布于 2018-01-16 05:35:47
最后,问题是http请求在一段时间后断开,这就是为什么当我在连接之后和创建对象之前立即迭代时find,而不是当我在响应之后使用时,但当我在开始迭代时启动连接时,一切都完美地工作=/。
干杯。
https://stackoverflow.com/questions/48015016
复制相似问题