如何在 django-rest 框架中获得正确的验证异常?

How to get the right Validation exception in django-rest framework?

我想捕获来自 django-rest-auth 的异常。 classrest_auth.serializers.LoginSerializer抛出各种异常,都是exceptions.ValidationError

msg = _('Must include "email" and "password".')
        raise exceptions.ValidationError(msg)

 msg = _('Must include "username" and "password".')
        raise exceptions.ValidationError(msg)

raise serializers.ValidationError(_('E-mail is not verified.'))

我只对处理最后一个感兴趣 'E-mail is not verified.' 但 try 块将捕获所有 ValidationError 异常。鉴于字符串也已翻译,我如何才能只处理我感兴趣的内容?这样检查可以吗还是有更好的方法?

if exc.data is _('E-mail is not verified.')
    # do stuff
    raise exc

根据验证错误消息处理异常可能有点反模式,您可能会后悔走这条路。解决此问题的一种方法是检查引发异常的条件 - 在它成为异常之前。

我没有您的应用的任何详细信息,但另一种选择是覆盖 rest_auth 序列化程序中的 'validate' 方法。这将允许您首先检查条件(在 rest_auth 之前)并根据需要进行处理。这个项目的好处是它们是开源的,你可以 view the source 看看它是如何引发这个错误的。

class SpecialValidator(LoginSerializer):
   def validate(self, attrs):
       username = attrs.get('username')
       email_address = user.emailaddress_set.get(email=user.email)
       if not email_address.verified:
           # This is where you put in your special handling
       return super(SpecialValidator, self).validate(attrs)