我遇到了同样的问题,花了几个小时解决了这个问题,我想出了一个解决方案。以下是你的做法:
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"})
干杯!!