如何在 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)
我想捕获来自 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)