使用ParseError Django REST Framework返回无效数据

时间:2014-09-02 19:18:27

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

关于在串行器之外验证Django REST Framework中的数据,我遇到了类似的问题:

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错误,这是不好的。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

来自文档:

  

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

     

如果您需要自定义API返回的错误响应,则应该对此方法进行子类化。

所以你需要覆盖它来处理ParseError例外。

另请查看Exceptions上的DRF文档。

我希望有所帮助。

答案 1 :(得分:0)

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

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

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

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

请注意,将它放在get_serializer_class()中就像我所做的那样导致它超出了DRF异常处理程序,因此Django正确地渲染它并显示错误被正确抛出。