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

Displaying a raw image using 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')

你应该使用 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 的任何功能。您应该从基础视图 class 继承,并将您的代码放在 get 方法中。