DRF не поддерживает несколько классов renderer_classes

Я использую 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

Использование любого из них отлично подходит для этого типа файлов. Но я хочу использовать оба, чтобы можно было использовать соответствующее средство визуализации в зависимости от запрошенного файла.

Но это дает ошибку, и работает только первый в наборе.

1 ответ

Согласен с @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()
Другие вопросы по тегам