2016-07-04 10 views
0

Ich möchte einige Bildbearbeitung machen, aber bevor ich das Bild rendern möchte. Dies ist, was ich versucht habe, aber es funktioniert nicht. Die Seite ist leer, keine Fehler, warum?Anzeigen eines Rohbildes mit CBVs in Django

class ImgThumbnail(DetailView): 
    queryset = Images.objects.all() 

    def render_to_response(self, context, **response_kwargs): 
     from PIL import Image 
     import requests 
     from io import BytesIO 

     response = requests.get('http://example.com/media/images/{}.jpg'.format(self.pk)) 
     img = Image.open(BytesIO(response.content)) 

     return HttpResponse(img, content_type='image/jpg') 
+0

Können Sie die Vorlage anzeigen? –

+0

Es gibt keine Vorlage, ich möchte das Bild direkt in den Browser rendern – Prometheus

Antwort

1

Sie sollten StreamingHttpResponse verwenden. In einer Art und Weise, wie:

(dynamischen Content-Typ und Content-Länge als Bonus)

try: 
    from cStringIO import StringIO 
except ImportError: 
    from io import StringIO 

from wsgiref.util import FileWrapper 
from django.http import HttpResponse, StreamingHttpResponse 


class ImgThumbnail(DetailView): 
    queryset = Images.objects.all() 

    def get(self, request, *args, **kwargs): 

     r = requests.get('http://example.com/media/images/{}.jpg'.format(self.pk)) 


     if not r.status_code == 200: 
      return HttpResponse('', status=r.status_code) 

     wrapper = FileWrapper(StringIO(r.content)) 
     response = StreamingHttpResponse(wrapper, content_type=r.headers.get('Content-Type')) 
     response['Content-Length'] = r.headers.get('Content-Length') 

     return response 
+0

ist StringIO Python 3? – Prometheus

+1

in Python 3 ist es Teil des 'io' Moduls. siehe aktualisierte Antwort – ohrstrom

0

Detailview hat keine render_to_response Methode, so gibt es keinen Punkt, um Ihre eigenen zu definieren.

Sie verwenden sowieso keine der Funktionen von DetailView. Sie sollten von der Basis-View-Klasse erben und Ihren Code in die get-Methode schreiben.

+0

Das ist ein guter Punkt, aber die Detailansicht scheint zu funktionieren. Es ruft den PK ab und gibt das korrekte Objekt zurück. '' return HttpResponse (img, content_type = 'image/jpg') '' dann überspringt die Vorlage Teil und rendert ok. aber wie du gesagt hast, könnte ich das alles in einer einfachen Ansicht tun – Prometheus

+0

Laut CBV '' DetailView'' hat '' render_to_response '' https://ccbv.co.uk/projects/Django/1.9/django.views.generic .detail/Detailansicht/ – Prometheus

+0

daniel hat recht. Sie sollten 'get' anstelle von' render_to_response' verwenden. Sie möchten direkt eine Antwort zurückgeben - ohne eine Vorlage zu rendern. – ohrstrom