我有一个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
答案 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
在视图中,您必须通过以下方式调用此渲染器:
或
注意。记住分号
如果您使用的装饰器如 @action ,则可能会出现由装饰器调用渲染器的问题。在这种情况下,您必须在 @action 装饰器中使用 renderer_classes :
@action(methods=['get'], detail=True, renderer_classes=(CustomRenderer,))