python 3.在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')

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

DetailView没有render_to_response方法,所以定义自己的方法是没有意义的。

你在这里没有使用任何DetailView的功能。你应该继承基视图类,并把你的代码放在get方法。

最新更新