【问题标题】:Define renderer class dynamically in Django view function在 Django 视图函数中动态定义渲染器类
【发布时间】:2021-09-01 00:59:27
【问题描述】:

如何根据某些条件在 Djanog 旧 api_view 函数中定义渲染器类?拥有这样的东西:

@api_view(['GET'])
def can_render_2_things(request):
    if some_comdition:
       renderer_classes = [PDFRenderer]
    else:
       renderer_classes = [JSONRenderer]

【问题讨论】:

    标签: python django django-views renderer


    【解决方案1】:

    从 Django docs 你可以使用不同的响应对象:

    from django.http import FileResponse, JsonResponse
    @api_view(['GET'])
    def can_render_2_things(request):
        if some_comdition:
           response = FileResponse(open('myfile.png', 'rb'))
        else:
           response = JsonResponse({'foo': 'bar'}, encoder=myJsonEncoder)
    

    【讨论】:

      【解决方案2】:

      如果您要设置的renderer_classes 列表包含只有一个 渲染器类,您可以自己在request 上设置属性accepted_rendereraccepted_media_type。这将导致使用正确的渲染器:

      @api_view(['GET'])
      def can_render_2_things(request):
          if some_comdition:
             request.accepted_renderer = PDFRenderer
             request.accepted_media_type = PDFRenderer.media_type
          else:
             request.accepted_renderer = JSONRenderer
             request.accepted_media_type = JSONRenderer.media_type
      

      但是如果你想设置更多的渲染,这不是很有用,我建议你简单地使用基于类的视图而不是基于函数的视图,并使用APIView

      from rest_framework.views import APIView
      
      
      class CanRender2Things(APIView):
          def get(self, request, format=None):
              if some_comdition:
                  self.renderer_classes = [PDFRenderer]
              else:
                  self.renderer_classes = [JSONRenderer]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多