Django REST API用于公开图像

时间:2014-10-29 00:55:50

标签: python django rest django-models django-rest-framework

我有一个django应用程序,我想要公开模型图像,这样当我请求/image/school_id/400时,它将返回标识为school_id的学校图像,并将其重新调整为400x400像素的框。这是我试过的

@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' codec can't decode byte 0xff in position 0: invalid start byte

如何返回图像? 我正在使用Django-rest-framework http://www.django-rest-framework.org/api-guide/renderers#advanced-renderer-usage

2 个答案:

答案 0 :(得分:9)

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

return HttpResponse(resized_img, content_type="image/png")

请注意,content_type应反映返回响应的内容类型,该内容类型应与要调整大小的图像的内容类型相匹配。


您获得的错误是因为Renderer类期望基于文本的响应,而不是图像数据。 Django REST Framework不会将自定义渲染器应用于HttpResponse类,只会应用于Django REST Framework Response类。

答案 1 :(得分:2)

我知道这是一个很老的问题,但是我找到了解决该问题的方法。 您可以使用Django Rest Framework中的custom renderer通过响应返回图像。 例如:

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_classes((CustomRenderer,))

  • 渲染器类: renderer_classes =(CustomRenderer,)

注意。记住分号

如果您使用的装饰器如 @action ,则可能会出现由装饰器调用渲染器的问题。在这种情况下,您必须在 @action 装饰器中使用 renderer_classes

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