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

How to stream images to the browser with Django

请原谅我是否错误地使用了这些术语,我对流式传输的概念还很陌生,而且我在谷歌搜索中没有找到很多讨论流式传输最佳用例的资源。

我现在拥有的:

浏览器向 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 class 的文档,但所有示例都显示了从服务器磁盘读取文件并将其传递给 StreamingHTTPResponse,而不是从其他服务获取文件。

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

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

您可以通过上下文将 url 传递给您的 html 文件。

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

然后在 html 中使用 like :

<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 下载图片,因为所有浏览器都能够从图片标签生成图片。

这是您可以做到的一种方法

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")

希望这对您有所帮助。