我正在使用Django 2.2和Django 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。
当我添加JSONRenderer
到renderer_classes
renderer_classes = (ZipRenderer, JSONRenderer)
这在异常情况下工作正常,但在成功响应的情况下会出错。
如何根据响应更改渲染器?