2016-07-04 5 views
0

私はいくつかの画像操作をしたいが、私はその前に画像をレンダリングしたい。これは私が試したことですが、うまくいきません。ページは空白ですが、エラーはありません、なぜですか?DjangoでCBVを使って生画像を表示する

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

テンプレートを表示できますか? –

+0

テンプレートがありません。ブラウザに画像を直接レンダリングしたいです。 – Prometheus

答えて

1

StreamingHttpResponseを使用してください。などのように:

(ボーナスなどの動的コンテンツタイプおよびコンテンツ長)

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

はStringIO Python 3ですか? Python 3の – Prometheus

+1

は 'io'モジュールの一部です。更新された回答を参照してください – ohrstrom

0

DetailViewはrender_to_responseメソッドを持っていないので、あなた自身を定義しても意味がありません。

あなたはここでDetailViewの機能を使用していません。基底のViewクラスから継承し、コードをgetメソッドに配置する必要があります。

+0

それは良い点ですが、詳細ビューが動作するようです。それはPKを取得し、正しいオブジェクトを返します。 '' HttpResponseを返す(img、content_type = 'image/jpg') ''は、テンプレート部分をスキップしてOKをレンダリングします。しかし、あなたが言ったように、私はこれをすべて単純な視点で行うことができます – Prometheus

+0

CBVによると、 '' DetailView''は '' render_to_response ''を持っています。https://ccbv.co.uk/projects/Django/1.9/django.views.generic .detail/DetailView/ – Prometheus

+0

ダニエルが正しいです。 'render_to_response'の代わりに' get'を使うべきです。テンプレートをレンダリングせずに直接レスポンスを返すことができます。 – ohrstrom

関連する問題