首页 > 解决方案 > 出错时返回不同的 Content-Type 响应

问题描述

给定一个带有一个渲染器的端点:

class PNGRenderer(BaseRenderer):
    media_type = 'image/png'
    format = 'png'

    def render(self, data, media_type=None, renderer_context=None):
        return data

@renderer_classes((PNGRenderer, ))
def some_endpoint(request, format=None):
    filename = 'foo.png'
    if not os.path.exists(filename):
        raise NotFound("File not found")
    else:
        with open(filename, 'rb') as f:
            data = f.read()
            return response(data)

application/json如果foo.png找不到,我想退货。显然,在现实生活中filename不是不断地而是动态的。"foo.png"

即使向端点提供了 format='png' ,我如何才能返回在响应Content-Type中正确设置的json 。application/json

标签: django-rest-framework

解决方案


在写问题时,我找到了更改渲染器的答案:request.accepted_renderer = JSONRenderer().

尤其是:

@renderer_classes((PNGRenderer, ))
def some_endpoint(request, format=None):
    filename = 'foo.png'
    if not os.path.exists(filename):
        request.accepted_renderer = JSONRenderer()
        raise NotFound("File not found")
    else:
        with open(filename, 'rb') as f:
            data = f.read()
            return response(data)

我不确定这是否是处理binary Content-Type异常的正确方法。


推荐阅读