我正在使用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。
答案 0 :(得分:2)
我找到了一种方法,可以使用自定义异常处理程序:
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。仍然希望有更好的答案。
答案 1 :(得分:2)
如果请求正常且文件存在,我将其读取为字节并将其传递给Response,作为自定义渲染器,我将PDFRenderer用作您的渲染器。如果请求不正确,我返回json。我的解决方案是检查数据是否是字节实例,否则,我只是从有效的json字符串中返回字节,因为render方法无论如何应该返回字节
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'))