python - 在异常时覆盖 django-rest-framework 中接受的渲染器

标签 python django django-rest-framework

我正在使用 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)

例如,当我的 View 显示为 raise PermissionDenied() 时,因为授权用户没有权限查看请求的 PDF,DRF 将 {'detail': 'You do not have permission to perform this action.'} 作为 data 参数到 PDFRenderer.render

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

最佳答案

毕竟我找到了一种使用自定义异常处理程序来执行此操作的方法:

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。仍然希望得到更好的答案。

关于python - 在异常时覆盖 django-rest-framework 中接受的渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45514806/

相关文章:

python - celery :启动时启动任务

Python "property object has no attribute"异常

django - 使用强制身份验证 Django Rest Framework 进行单元测试

django - 在 Django Rest 框架中序列化/反序列化外键

python - 我需要一种方法将多个键映射到字典中的相同值

python - 在 pandas 数据框中搜索不需要的值

python - 将不在模型中的字段添加到 Django ModelForm

django:我可以在 html 模板中编写 python 吗?

python - Django REST 嵌套路由器

python - 如何将 bootstrap wysiwyg 添加到 flask 中?