2016-04-08 6 views
1

Verzeihen Sie, wenn ich diese Begriffe falsch verwende, bin ich ziemlich neu im Konzept des Streaming und ich habe nicht viele Ressourcen in Googling gefunden, die über die besten Anwendungsfälle für gesprochen haben Streaming.So streamen Bilder mit Django zum Browser

Was ich habe jetzt:

Browser eine Anforderung von einem Bild zu einem Django Endpunkt

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

Django um macht für ein Bild eine weitere Anforderung an einen Dienst schaltet macht

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

Mein Verständnis dieses Prozesses ist, dass Django alle binären Informationen für dieses Bild in den Speicher liest, bevor es sich dreht, um die Antwort an den Browser zu liefern. Gibt es einen Weg, den ich direkt zum Browser streamen kann, anstatt darauf zu warten, dass das Bild vollständig an Python geliefert wird?

Ich habe die Dokumentation für die StreamingHTTPResponse Klasse gelesen, aber alle Beispiele zeigen einfach das Lesen einer Datei von der Festplatte des Servers und die Weitergabe an eine StreamingHTTPResponse, nicht von einem anderen Dienst.

Antwort

1

Dies ist eine Möglichkeit, die Sie tun können, dass

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

Hope this hilfreich.

1

Sie müssen nicht herunterladen Bildinhalt mit requests.get. Sagen wir:

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

Sie können die URL einfach per Kontext an Ihre HTML-Datei übergeben.

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

dann in html wie verwenden:

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

Oder wenn Sie AJAX verwenden:

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

dann in html:

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

Diese django Weise wird nur Übergeben Sie die URL an die Bildansicht und das Bild wi ll render vom Frontend. Sie müssen das Bild nicht mit requests.get herunterladen, da alle Browser Bilder aus dem Image-Tag generieren können.

+0

Leider muss ich die requests.get ausführen - was ich nicht eingeschlossen habe ist, dass der Service, den ich anrufe, ein authentifizierter Endpunkt ist, der ein Token mit der Anfrage authentifizieren muss, bevor es das Bild zurückgibt. – diplosaurus

+0

Sie können überprüfen, ob der erzeugte Bildlink statisch ist oder nicht. –