如何使用Django将图像流式传输到浏览器

时间:2016-04-08 06:20:14

标签: python django streaming

请原谅我,如果我错误地使用这些术语,我对流媒体的概念很陌生,而且我在Googling中找不到很多资源,讨论了流媒体的最佳用例。

我现在拥有的:

浏览器向Django端点发出图像请求

var img = new Image();
img.src = 'http://www.example.com/api/images/51234/
img.onload = function() {
    $('#my-img').attr('src', this.src);
}

Django转身向图像服务发出另一个请求

import requests

def get_image(request, img_id):
    response = requests.get("http://api.myexample.net/album/123/img/{0}".format(img_id))

    return HttpResponse(res.content, mimetype="image/jpeg")

我对这个过程的理解是Django会在转向向浏览器提交响应之前将该图像的所有二进制信息读入内存。有没有办法可以将它直接流式传输到浏览器,而不是等待图像完全传递给Python?

我已阅读StreamingHTTPResponse类的文档,但所有示例都只显示从服务器磁盘读取文件并将其传递给StreamingHTTPResponse,而不是从其他服务获取。

2 个答案:

答案 0 :(得分:1)

您无需使用requests.get获取下载图像内容。让我们说:

def viewFunc(request):
    image_url = 'some.image.url.jpg'

您只需通过上下文将网址传递给您的html文件。

return render(request, 'some_html.html', {'image_url':image_url})

然后在html中使用如:

<img src="{{image_url}}" id="image_id">

或者如果您使用的是ajax:

return HttpResponse(json.dumps({'image_url':image_url}))

然后在html:

success : function(response){
    var image_url = response.image_url;
    $('#image_id').attr('src',image_url);
}

这样django只会将url传递给图像视图,图像将从前端渲染。无需使用requests.get下载图像,因为所有浏览器都能够从图像标记生成图像。

答案 1 :(得分:1)

这是你可以做到的一种方式

import requests
# have this function in file where you keep your util functions 
def url2yield(url, chunksize=1024):
   s = requests.Session()
   # Note: here i enabled the streaming
   response = s.get(url, stream=True)

   chunk = True
   while chunk :
      chunk = response.raw.read(chunksize)

      if not chunk:
         break

      yield chunk


# Then creation your view using StreamingHttpResponse
def get_image(request, img_id):
   img_url = "http://api.myexample.net/album/123/img/{0}".format(img_id)
   return StreamingHttpResponse(url2yield(img_url), content_type="image/jpeg")

希望这有用。