2016-03-27 9 views
0

私はdjango-rest-authから例外をキャッチしたいと思います。クラスrest_auth.serializers.LoginSerializerは私が最後の取扱いにのみ興味を持って、すべてのexceptions.ValidationErrordjango-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.')) 

をさまざまな例外をスローする「Eメールが確認されていません。」 tryブロックはすべてのValidationError例外をキャッチします。文字列も翻訳されているので、私に興味のあるものだけをどう扱うことができますか?このようなチェックは大丈夫か、より良い方法がありますか?

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

答えて

1

「検証エラー」メッセージに基づく例外を処理することは、パターンが少し違っている可能性があり、その道路を下ることは残念です。これを回避する方法の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

関連する問題