在django-rest-framework中使用格式错误的UUID时,服务器会抛出异常并返回状态代码500.不处理异常ValueError'格式错误的十六进制UUID字符串'。
正确处理它并返回状态代码400更有意义。
我设法使用自定义异常处理程序,但这是一个非常混乱和丑陋的解决方案。
我考虑过使用自定义序列化程序,但我不确定如何正确处理这个问题,如果这是正确的django方法。
您怎么看?
干杯。
答案 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}'