在Django中使用CBV显示原始图像

时间:2016-07-04 11:12:04

标签: django python-3.x pillow

我想做一些图像处理,但在此之前我想渲染图像。这是我尝试过的,但它不起作用。页面是空白的,没有错误,为什么?

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

2 个答案:

答案 0 :(得分:2)

您应该使用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

答案 1 :(得分:0)

DetailView没有render_to_response方法,因此定义自己的方法毫无意义。

无论如何,您还没有使用DetailView的任何功能。您应该从基础View类继承,并将代码放在get方法中。