繁体   English   中英

用于公开图像的 Django REST API

[英]Django REST API to expose images

我有一个 django 应用程序,我想公开模型图像,这样当我请求/image/school_id/400 ,它将返回带有 id 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

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

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

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


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

我知道这是一个很老的问题,但我找到了解决这个问题的方法。 您可以使用 Django Rest Framework 中的自定义渲染器通过Response返回图像。 例如:

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,))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM