如何使用 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")
希望这对您有所帮助。
请原谅我是否错误地使用了这些术语,我对流式传输的概念还很陌生,而且我在谷歌搜索中没有找到很多讨论流式传输最佳用例的资源。
我现在拥有的:
浏览器向 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")
希望这对您有所帮助。