如何进行二进制资源的内容谈判



我有一个端点,x,它像魅力一样吐出json。可以将相同的资源生成到二进制变体中。X的端点是由视图集制成的,X的二进制版本在动作范围的帮助下具有自己的终点。

class XViewSet(ReadOnlyModelViewSet):
    queryset = X.objects.all()
    serializer_class = XSerializer
    @action(detail=True, methods=['get'])
    def binary(self, request, pk=None):
        x = self.get_object()
        binx = x.get_binary(FORMAT)
        ..

显然,binary永远不会吐出JSON。我如何获得协商的格式,以及如何告诉Django-Rest-Framework关于binary支持的二进制格式?

您不应该从 ViewSet返回二进制数据,但要有一个自定义渲染器将其转换为:

from rest_framework.renderers import BaseRenderer, JSONRenderer
class BinaryRenderer(BaseRenderer):
    media_type = 'application/octet-stream'
    format = 'bin'
    render_style = 'binary'
    charset = None
    def render(self, data, media_type=None, renderer_context=None):
        # Either use `data` or access the view via
        # the `renderer_context` 
        view = renderer_context['view']
        return view.get_object().get_binary()
class XViewSet(ReadOnlyModelViewSet):
    queryset = X.objects.all()
    serializer_class = XSerializer
    renderer_classes = (JSONRenderer, BinaryRenderer)

查看有关如何确定渲染器的文档。

最新更新