2016-03-27 8 views
0

Ich möchte eine Ausnahme von Django-Rest-Auth zu fangen. Die Klasse rest_auth.serializers.LoginSerializer wirft verschiedene Ausnahmen, alle exceptions.ValidationErrorWie bekomme ich die richtige Validierungsausnahme im Django-Rest Framework?

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

ich nur daran interessiert bin der letzte im Umgang mit ‚E-Mail verifiziert wird, nicht.‘ aber ein try-Block fängt alle ValidationError-Ausnahmen ab. Wie kann ich nur mit dem umgehen, was mich interessiert, da die Zeichenkette auch übersetzt wird? wäre ein solcher Check in Ordnung oder gibt es einen besseren Weg?

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

Antwort

1

Handhabung Ausnahmen auf der Validierungs-Fehlermeldung auf Basis könnte ein bisschen ein anti-Muster sein, und man könnte bedauern diese Straße hinunter gehen. Eine Möglichkeit ist es, die Bedingungen zu prüfen, die die Ausnahmen auslösen - bevor es zu einer Ausnahme kommt.

Ich habe keine Details Ihrer App, aber eine andere Option wäre es, die 'validate' Methode in rest_auth Serializer zu überschreiben. Dies würde es Ihnen erlauben, das für die Bedingung zuerst zu überprüfen (vor rest_auth) und es so zu behandeln, wie Sie wollen. Das Schöne an diesen Projekten ist, dass sie Open Source sind, und Sie können view the source sehen, wie es diesen Fehler auslöst.

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

Vielen Dank für Ihre Antwort. Ich habe darüber nachgedacht, die LoginSerializer-Klasse zu klassifizieren und die validate-Methode zu überschreiben. Mein Hauptanliegen war, dass die Validierungsmethode viele Codezeilen enthält, die ich in meine Überschreibung kopieren musste. Dadurch würde ich im Wesentlichen eine Verzweigung erzeugen, die von späteren Verbesserungen nicht profitieren würde. Aber Ihr Vorschlag scheint einfacher. – voger

Verwandte Themen