2016-03-27 56 views
0

我想从django-rest-auth中发现一个异常。类rest_auth.serializers.LoginSerializer抛出各种异常,所有exceptions.ValidationError如何在django-rest框架中获得正确的验证异常?

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.')) 

我只在处理最后一个感兴趣“电子邮件没有被证实。”但try块会捕获所有ValidationError异常。鉴于字符串也被翻译,我怎样才能处理我感兴趣的问题?这样的支票会好吗还是有更好的办法?

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

回答

1

基于验证错误消息处理异常可能有点反模式,您可能会后悔那条道路。解决这个问题的一个方法是检查引发异常的条件 - 在它出现异常之前。

我没有关于你的应用程序的任何细节,但另一个选择是覆盖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) 
+0

谢谢你的回答。我曾考虑过对LoginSerializer类进行子分类并重写validate方法。我主要关心的是验证方法有许多代码行,我不得不复制到我的覆盖,并通过这样做,我基本上会创建一个叉,不会从以后的改进中受益。但是你的建议似乎更简单。 – voger