【问题标题】:Return image using Django REST framework Render使用 Django REST 框架渲染返回图像
【发布时间】:2017-02-11 14:23:14
【问题描述】:

我使用 Django REST Framework 上传了图片。现在我正在尝试返回与响应相同的图像。

views.py

class ImageUploadView(viewsets.ModelViewSet):
    queryset = ImageModel.objects.all()
    serializer_class = ImageSerializer

    def create(self, request, *args, **kwargs):
        userID = (request.data.get('userID'))
        serializer = self.get_serializer(data=request.data)
        if not UserModel.objects.filter(id=userID).exists():
            return Response(data={"detail": "Invalid UserID"})
        else:
            if serializer.is_valid():
                serializer.save()                
                return Response(ImageModel.objects.get(id=serializer.data['id']).image, content_type="image/png")
        return Response(data={"detail": "Serializer Error"})

通过使用上面的代码,我既没有得到有效的图像(它返回一个像图像一样的小方块)也没有错误
希望有人能帮忙,谢谢

【问题讨论】:

  • 你应该在返回之前序列化数据
  • 你能举个例子吗?
  • 我认为您正在返回图片的网址。请检查 html 的 url 是否正确

标签: python django django-rest-framework


【解决方案1】:

我遇到了同样的问题,花了几个小时解决了这个问题,我想出了一个解决方案。以下是你的做法:

1。创建自定义渲染器

首先,您需要创建一个称为自定义渲染器的东西。如果您想了解更多关于渲染器是什么以及如何制作自定义渲染器的信息,这里是link to the REST Framework's Renderers Documentation。在这种情况下,我们必须为 .jpg.png 文件制作自定义渲染器。为此,我建议您创建一个名为 custom_renderers.py 的文件并将以下代码复制到其中:

custom_renderers.py

from rest_framework import renderers

class JPEGRenderer(renderers.BaseRenderer):
    media_type = 'image/jpeg'
    format = 'jpg'
    charset = None
    render_style = 'binary'

    def render(self, data, media_type=None, renderer_context=None):
        return data

class PNGRenderer(renderers.BaseRenderer):
    media_type = 'image/png'
    format = 'png'
    charset = None
    render_style = 'binary'

    def render(self, data, media_type=None, renderer_context=None):
        return data

2。通过

导入渲染器并将它们包含在您的视图中

在此之后,如果您使用的是基于类的视图(或者如果您使用的是基于方法的视图,则必须导入刚刚制作的渲染并将它们包含在属性 renderer_classes = [JPEGRenderer, PNGRenderer] 中的视图中,您必须将它们包含在装饰器下@renderer_classes())

3。您的其余视图和返回语句

如果您在视图中提供图像或任何类型的图像,您必须首先使用您收到的图像对象旁边的.open() 作为响应字段打开图像或文件您的查询,然后在发送之前使用FileWrapper() 包装图像(我在响应中收到一个小黑框的原因就像您一样,是因为我在发送之前没有打开图像,也没有使用了 FileWrapper())。所以,你的回应就像 - return Response(FileWrapper(ImageModel.objects.get(id=serializer.data['id'])['image'].open())

我没有指定返回类型,因为在我的例子中返回类型是自动确定的。因此,您的 views.py 最终将是:

## All the other necessary imports

from path.to.custom_renderers import JPEGRenderer, PNGRenderer
from wsgiref.util import FileWrapper

#Also, I think this should rather be ImageDownloadView as the client would be downloading the image
class ImageUploadView(viewsets.ModelViewSet):
    renderer_classes = [JPEGRenderer, PNGRenderer]

    queryset = ImageModel.objects.all()
    serializer_class = ImageSerializer

    def create(self, request, *args, **kwargs):
        userID = (request.data.get('userID'))
        serializer = self.get_serializer(data=request.data)
        if not UserModel.objects.filter(id=userID).exists():
            return Response(data={"detail": "Invalid UserID"})
        else:
            if serializer.is_valid():
                serializer.save()                
                return Response(FileWrapper(ImageModel.objects.get(id=serializer.data['id'])['image'].open())
                # You can also specify the content_type in your response
        return Response(data={"detail": "Serializer Error"})

干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多