【问题标题】:How to handle python django rest-framework-api malformed UUID instead of 500?如何处理 python django rest-framework-api 格式错误的 UUID 而不是 500?
【发布时间】:2017-10-28 23:57:47
【问题描述】:

在 django-rest-framework 中使用格式错误的 UUID 时,服务器会抛出异常并返回状态码 500。不处理异常 ValueError 'badly forms hexadecimal UUID string'。

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

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

我曾考虑过使用自定义序列化程序,但我不确定如何正确处理,以及这是否是正确的 django 方法。

你怎么看?

干杯。

【问题讨论】:

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


    【解决方案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()
    

    【讨论】:

    • 这是我的第一个想法,但我更喜欢更通用的整体项目解决方案
    【解决方案2】:

    添加

    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}'
    

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2015-01-20
      • 2015-03-05
      • 1970-01-01
      • 2018-07-31
      • 2021-01-12
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多