我遇到了同样的问题,花了几个小时,然后想出了一个解决方案。操作方法如下:
1. 创建自定义渲染器
首先,您需要创建称为自定义渲染器的东西。这是链接到 REST Framework 的渲染器文档如果您想了解更多有关渲染器是什么以及如何制作自定义渲染器的信息。在这种情况下,我们必须为以下内容制作自定义渲染器.jpg and .png文件。为此,我建议您创建一个名为自定义渲染器.py并将以下代码复制到其中:
自定义渲染器.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()
在发送之前包装图像(我在响应中收到一个小黑框的原因就像你一样,是因为我在发送图像之前没有打开图像,也没有使用文件包装器())。所以,你的回应是这样的——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"})
Cheers!!