Python Django REST API公开图像

Python Django REST API公开图像,python,django,rest,django-models,django-rest-framework,Python,Django,Rest,Django Models,Django Rest Framework,我有一个django应用程序,我想公开模型图像,这样当我请求/image/school_id/400时,它将返回id为school_id的学校图像,并将其裁剪和调整为400x400 px的方框。这是我试过的 @api_view(['GET', 'POST']) def image_view(request, school_id, size): image = School.objects.get(school__pk=school_id).image resized_img

我有一个django应用程序,我想公开模型图像,这样当我请求
/image/school_id/400
时,它将返回id为
school_id
的学校图像,并将其裁剪和调整为400x400 px的方框。这是我试过的

@api_view(['GET', 'POST'])
def image_view(request,  school_id, size):

    image = School.objects.get(school__pk=school_id).image
    resized_img = image #Handle resizing here

    return Response(resized_img, content_type='*/*')
我得到的只是一个错误,
“utf8”编解码器无法解码位置0处的字节0xff:无效的起始字节

如何返回图像? 我正在使用Django rest框架

您试图返回原始图像数据,并让Django REST Framework呈现响应。由于响应不应基于所选格式而有所不同,因此应使用原始HttpResponse对象

return HttpResponse(resized_img, content_type="image/png")
请注意,
content\u type
应该反映返回响应的内容类型,它应该与正在调整大小的图像的内容类型相匹配



您得到的错误是因为
呈现程序
类需要基于文本的响应,而不是图像数据。Django REST框架不会将自定义呈现器应用于
HttpResponse
类,只会应用于Django REST框架
Response
类。

我知道这是一个相当老的问题,但我找到了解决这个问题的方法。 您可以使用from Django Rest框架通过响应返回图像。 例如:

class CustomRenderer(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
在视图中,您必须通过以下方式调用此渲染器:

  • 装饰器:@renderer\u类((CustomRenderer,)

  • 渲染器类:渲染器\u类=(自定义渲染器,)
注意。还记得分号吗

如果您使用的是类似于@action的decorator,那么您可能无法通过decorator调用渲染器。在这种情况下,您必须在@action装饰器中使用渲染器\u类

@action(methods=['get'], detail=True, renderer_classes=(CustomRenderer,))

自Django 1.8以来,还有Django.http.FileResponse