如何处理python django rest-framework-api格式错误的UUID而不是500?

时间:2017-05-28 16:24:33

标签: python django django-rest-framework uuid http-status-code-500

在django-rest-framework中使用格式错误的UUID时,服务器会抛出异常并返回状态代码500.不处理异常ValueError'格式错误的十六进制UUID字符串'。

正确处理它并返回状态代码400更有意义。

我设法使用自定义异常处理程序,但这是一个非常混乱和丑陋的解决方案。

我考虑过使用自定义序列化程序,但我不确定如何正确处理这个问题,如果这是正确的django方法。

您怎么看?

干杯。

2 个答案:

答案 0 :(得分:1)

我通过覆盖ViewSet来解决这个问题,因为它负责在将对象传递给序列化程序之前获取对象。为了方便起见,我创建了UUIDViewSetMixin以将其添加到所需的视图集。

class UUIDViewSetMixin(object):
    lookup_field = 'id'

    def get_object(self):
        value = self.kwargs.get(self.lookup_field)
        try:
            uuid.UUID(value)
        except ValueError:
            result = {
                'code': 'bad_request',
                'message': _("'%(value)s' is not a valid uuid") % {'value', value}
            }
            return JsonResponse(data=data, request=status=status.HTTP_400_BAD_REQUEST)
        return super(UUIDViewSetMixin, self).get_object()

答案 1 :(得分:1)

添加

lookup_value_regex = '[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}' 

使用django验证视图仅允许处理UUID,否则将自动获取404。

https://www.django-rest-framework.org/api-guide/routers/

文档中的示例:

class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    lookup_field = 'my_model_id'
    lookup_value_regex = '[0-9a-f]{32}'