3

我正在使用Django 2.2Django REST Framework

我有一个APIView将在成功响应时下载 Zip 文件的文件。

class MultiDownloadCode(APIView):

    serializer_class = MultiDownloadSerializer
    permission_classes = (
        IsAuthenticated,
        CodeCanExport,
    )
    renderer_classes = (ZipRenderer,)

    def post(self, request):
        ...
        mime_type = 'application/zip'

        file_name = '{}.zip'.format(random_string(20))

        response = Response(data=in_memory_zip.read(), content_type=mime_type)
        response['Content-Disposition'] = 'attachment; filename=%s' % "-".join(file_name.split())

        return response

我创建了一个自定义渲染器类ZipRenderer

class ZipRenderer(BaseRenderer):
    media_type = 'application/zip'
    format = 'zip'
    charset = 'utf-8'
    render_style = 'binary'

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

如果响应成功,这可以正常工作。但是在权限被拒绝异常的情况下,错误消息也是二进制编码的,并且没有正确呈现 JSON。

当我添加JSONRendererrenderer_classes

renderer_classes = (ZipRenderer, JSONRenderer)

这在异常情况下工作正常,但在成功响应的情况下会出错。

如何根据响应更改渲染器?

4

0 回答 0