django - DRF 不支持多个渲染器类
问题描述
我正在使用Django 2.x和DRF
我有一个视图,它以不同的格式返回二进制数据,如pdf
,eps
等。
要返回二进制响应,我设置了renderer_classes
属性,我的观点是
class DownloadQRCode(APIView):
renderer_classes = (PdfFileRenderer, EPSRenderer,)
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
name = serializer.validated_data.get('name')
data = serializer.validated_data.get('data')
mimetype = None
if data and name:
imgarr = name.rsplit('.', 1)
if len(imgarr) == 2:
name, format = imgarr
if format == 'pdf':
data = str(unquote(data, encoding='utf-8'))
data, mimetype = generate_data_cairo(data, format)
if format == 'eps':
data = str(unquote(data, encoding='utf-8'))
data, mimetype = svg_2_eps(data)
if data and mimetype:
response = Response(data=data, content_type=mimetype)
response['Content-Disposition'] = 'attachment; filename=%s' % "-".join(name.split())
return response
else:
return Response(status=status.HTTP_400_BAD_REQUEST, data='Either data or mime type was missing')
else:
return Response(status=status.HTTP_400_BAD_REQUEST, data='filename does not contain formatInfo')
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
我有两个renderer_classes
PdfFileRenderer
class PdfFileRenderer(BaseRenderer):
media_type = 'application/octet-stream'
format = None
charset = None
render_style = 'binary'
def render(self, data, media_type=None, renderer_context=None):
return data
和EPSRenderer
class EPSRenderer(BaseRenderer):
media_type = 'image/eps'
format = None
charset = 'utf-8'
render_style = 'binary'
def render(self, data, accepted_media_type=None, renderer_context=None):
return data
对于该文件类型,使用其中任何一个都可以正常工作。但我想同时使用两者,以便可以根据请求的文件使用适当的渲染器。
但是,这会产生错误,并且只有集合中的第一个有效。
解决方案
同意@Nafees
通过覆盖get_renderer()
方法解决了它。
def get_renderer(self):
imgarr = name.rsplit('.', 1)
name, format = imgarr
if format == 'pdf':
return [BinaryRenderer()]
if format == 'eps':
return [EPSRenderer()]
return super().get_renderer()
推荐阅读
- javascript - 每行文本的不同速度
- flutter - Websocket 在不同的客户端语言上表现不同
- nginx - nginx 1.21.1 - 请求行中的空格 - 400 Bad Request
- visual-studio-code - How to detect if an editor is a markdown preview?
- javascript - 数组没有在本地存储中被覆盖
- java - 当 RecyclerView 滚动到特定点时(从底部开始并在屏幕中间完成其进度)时为 ProgreessBar 设置动画
- reactjs - 将 Formik JSON 反应为 YAML,然后在提交时返回 JSON
- python - python中具有合理NaN行为的经验CDF函数
- android - 我们可以在 golang android OS 中打开带有传递 URL 的浏览器吗?
- c++ - 不销毁属于联合成员的类类型的对象是否安全?