![](/img/trans.png)
[英]How to expose a filtered reverse relationship in Django REST API framework?
[英]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
在视图中,您必须通过以下方式调用此渲染器:
或者
笔记。 记住分号
如果您使用像@action这样的装饰器,您可能会遇到通过装饰器调用渲染器的问题。 在这种情况下,您必须在@action装饰器中使用renderer_classes :
@action(methods=['get'], detail=True, renderer_classes=(CustomRenderer,))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.