【问题标题】:Override accepted renderer in django-rest-framework on exception在异常时覆盖 django-rest-framework 中接受的渲染器
【发布时间】:2018-01-12 20:45:18
【问题描述】:

我正在使用 django-rest-framework 创建一个返回 PDF 的端点。但是,当呈现 PDF 时出错时,我想返回 JSON 响应。但是 DRF 将异常数据传递给我的 PDFRenderer 类。如果出现错误,我该如何使用 JSONRenderer?

class PDFRenderer(BaseRenderer):
    """ DRF renderer for PDF binary content. """
    media_type = 'application/pdf'
    format = 'pdf'
    charset = None
    render_style = 'binary'

    def render(self, data, media_type=None, renderer_context=None):
        return bytes(data)

例如,当我的视图显示raise PermissionDenied() 时,由于授权用户无权查看请求的PDF,DRF 将{'detail': 'You do not have permission to perform this action.'} 作为data 参数传递给PDFRenderer.render

编辑:我尝试了custom exception handler,但显然您仍然必须通过 DRF 的异常处理程序运行它,然后将其传递给 PDFRenderer。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    毕竟,我找到了一种使用自定义异常处理程序的方法:

    from rest_framework.renderers import JSONRenderer
    from rest_framework.views import exception_handler
    
    
    def custom_exception_handler(exc, context):
        """ Switch from PDFRenderer to JSONRenderer for exceptions """
        if context['request'].accepted_renderer.format == 'pdf':
            context['request'].accepted_renderer = JSONRenderer()
        return exception_handler(exc, context)
    

    感觉很hacky。仍然希望得到更好的答案。

    【讨论】:

      【解决方案2】:

      如果请求正常并且文件存在,我将其作为字节读取并将其传递给响应,作为自定义渲染器,我使用 PDFRenderer 作为您的。如果请求不正确,我返回 json。我的解决方案是检查数据是否是字节实例,如果不是,我只是从有效的 json 字符串返回字节,因为渲染方法无论如何都应该返回字节

      class PDFRenderer(BaseRenderer):
          media_type = 'application/pdf'
          format = 'pdf'
          charset = None
          render_style = 'binary'
      
          def render(self, data, media_type=None, renderer_context=None):
              if isinstance(data, bytes):
                  return data
              data_to_response = json.dumps(data)
              return bytes(data_to_response.encode('utf-8'))
      

      【讨论】:

        猜你喜欢
        • 2017-03-06
        • 1970-01-01
        • 2016-04-14
        • 2013-06-24
        • 1970-01-01
        • 2017-11-23
        • 2017-12-11
        • 1970-01-01
        • 2017-08-28
        相关资源
        最近更新 更多