【问题标题】:Using ParseError Django REST Framework to return invalid data使用 ParseError Django REST Framework 返回无效数据
【发布时间】:2014-10-27 03:38:00
【问题描述】:

我有一个类似的问题,关于在序列化程序之外验证 Django REST 框架中的数据:

Raise Validation Error In Pre_Save Using Django Rest Framework

我的代码:

def pre_save(self, obj):
    data = self.request.DATA['users']
    for user in data:
        if not user in allowed_users:
            raise ParseError('An unpermitted user has been included')

从跟踪来看,它似乎正在尝试发送响应,但失败了:

"" 需要有一个字段值才能使用这种多对多关系。

更新:

我将 ParseError 提升到 get_serializer_class() 方法中,如下所示:

def get_serializer_class(self):
    if 'users' in self.request.DATA:
        # make sure the users are allowed
        data = self.request.DATA['users']
        for user in data:
            if not user in allowed_users:
                raise ParseError(detail='Unpermitted user')
    return serializer

这会引发异常,但是,它不会使用 REST 框架的 JSON 响应返回它。相反,我得到了 django 堆栈跟踪和 500 错误,这不好。

谢谢!

【问题讨论】:

    标签: django rest python-2.7 django-rest-framework


    【解决方案1】:

    查看APIView's handle_exception — 这是 DRF 处理请求期间引发的异常的地方。

    来自文档:

    默认实现处理rest_framework.exceptions.APIException 的任何子类,以及Django 的Http404PermissionDenied 异常,并返回适当的错误响应。

    如果您需要自定义 API 返回的错误响应,您应该继承此方法。

    所以你也需要重写它来处理ParseError 异常。

    还可以查看Exceptions 上的 DRF 文档。

    希望对你有帮助。

    【讨论】:

    • 感谢卡尔顿的提示。看起来问题与 Browsable API 有更多关系。
    【解决方案2】:

    当视图类的 pre_save 方法 ()、post_save() 或什至 post() 方法中引发异常时,Django-REST-Framework 已正确处理该异常。如果我一直在使用 curl 或类似的,错误将被正确返回。

    这实际上是可浏览 API 中的一个错误,这是我用来测试的 - 使用“原始数据”表单发送数据。在尝试呈现 html 响应时,DRF 显然试图捕获帖子的“上下文”。在这种情况下,它需要保存/完成的帖子。

    那不存在,所以抛出了 Django 渲染错误,这让我很困惑。

    使用 curl 进行测试时,响应准确。

    请注意,像我一样将它放入 get_serializer_class() 会导致它超出 DRF 异常处理程序,因此 Django 正确呈现它并显示错误被正确抛出。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 2021-07-18
      • 2020-04-12
      • 1970-01-01
      • 2023-01-17
      • 2013-03-24
      • 2019-08-19
      • 2021-09-18
      相关资源
      最近更新 更多