2016-04-08 91 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

您可以檢查正在生成的圖像鏈接是否是靜態的。 –

相關問題