2016-04-08 71 views
1

请原谅我,如果我错误地使用了这些术语,我对流式处理的概念相当陌生,而且我没有在Google上找到很多关于最佳用例的资源流。如何使用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类的文档,但所有示例都显示仅从服务器磁盘读取文件并将其传递到StreamingHTTPResponse,而不是从其他服务获取文件。

回答

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

希望这是有帮助的一种方式。

1

您不必使用requests.get获取下载图像内容。可以这样说:

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

你可以简单地通过上下文将url传递给你的html文件。

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

然后在HTML中使用,如:

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

或者,如果你正在使用AJAX:在HTML

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

然后:

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

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

+0

不幸的是我觉得我确实需要做requests.get - 我没有包括的是我调用的服务是一个经过身份验证的端点,需要在请求之前使用请求对令牌进行身份验证,然后才会返回映像。 – diplosaurus

+0

您可以检查正在生成的图像链接是否是静态的。 –

相关问题