RESTful API的Django Streaming HTTP响应

时间:2018-09-04 22:54:00

标签: django rest http

我有一个Django应用程序,需要与医学图像数据库进行交互。它们具有RESTful API,该API返回字节流,我正在将其写入HttpStreamingResponse。这是可行的,但问题是它非常慢。我正在下载的大多数文件都在100mb左右,通常甚至需要15到20秒才能开始下载。有谁知道如何加快此过程并更快地开始下载?

这是我的代码:

# Make api call
response = requests.get(url, cookies=dict(JSESSIONID=self.session_id))
# write bytes to Http Response 
http = StreamingHttpResponse(io.BytesIO(response.content), content_type='application/zip')

http['Content-Disposition'] = 'attachment; filename="%s.zip"' % patient_id
return http

1 个答案:

答案 0 :(得分:0)

您正在将完整的响应下载到服务器,然后再传递信息。

您应该使用以下命令转发来自API调用的响应:

res = FROM API CALL
response = HttpResponse(ContentFile(res.content), 'application/zip')
response['Content-Disposition'] = 'attachment; filename={}.zip'.format(patient_id)
response['Content-Length'] = res.headers.get('Content-Length')
response['Content-Transfer-Encoding'] = res.headers.get('Content-Transfer-Encoding')
response['Content-Type'] = res.headers.get('Content-Type')
return response

确保您复制了所有重要的标题。


编辑:由于这是唯一提出的解决方案,因此我正在编辑,以一种更具可读性的格式包括约翰的评论中的解决方案:

# Make api call 
response = requests.get(url, cookies=dict(JSESSIONID=self.session_id), stream=True) 
# write bytes to Http Response 
http = StreamingHttpResponse(response.iter_content(8096), content_type='application/zip') 
http['Content-Disposition'] = 'attachment; filename="%s.zip"' % patient_id 
return http