2017-08-04 46 views
4

我正在使用django-rest-framework创建一个返回PDF的端点。但是,当呈现PDF时出现错误时,我想返回JSON响应。但DRF将异常的数据传递给我的PDFRenderer类。只有在出现错误时,我如何才能使用JSONRenderer?在例外中覆盖django-rest-framework中的可接受渲染器

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。

回答

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) 

感觉相当哈克。仍希望有更好的答案。