2016-06-03 4 views
1

ich eine einfache Registrierungsfunktion haben, wo ein neuer Benutzer folgende Informationen zu geben hat:Python Flask fangen mehrere Integritätsfehler = verschiedene Fehlermeldungen, wenn der Benutzer oder E-Mail führt Integritätsfehler

Email (einmalig)

Benutzername (ist einzigartig, Primärschlüssel)

Passwort

Kennwort bestätigt

Problem:

Wenn der Benutzer in allen Informationen füllt und die Benutzername oder E-Mail sind bereits in der Datenbank, erhalte ich einen Integritätsfehler, die in Ordnung ist. Ich kann versuchen, es zu fangen und eine Information anzeigen, dass einer von denen bereits benutzt wird.

Aber es wäre viel nützlicher, wenn ich genau sagen könnte, was bereits verwendet wird. Zum Beispiel könnte die E-Mail in Ordnung sein, aber wenn der Benutzername verwendet wird, sollte es "Wählen Sie einen anderen Benutzernamen" sagen.

Ich hoffe, Sie haben das Problem.

Das ist der Code, den ich verwenden (es gibt auch bereits eine Überprüfungsfunktion darin aber es funktioniert gut und ist nicht wichtig):

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
form = NewUserForm() 
if form.validate_on_submit(): 
    new_user = User(email=form.email.data, username=form.username.data, password=make_hash(form.password.data)) 
    try: 
     if new_user: 
      db_session.add(new_user) 
      db_session.commit() 
      token = generate_confirmation_token(new_user.email) 

      confirm_url = url_for('confirm_email', token=token, _external=True) 

      html = render_template('activate.html', confirm_url=confirm_url) 

      subject = "Bitte bestätigen Sie Ihre Registrierung" 

      send_email(new_user.email, subject, html) 

      login_user(new_user) 
      flash('Registrierung erfolgreich! Wir haben Ihnen einen Bestätigungsemail auf die, von Ihnen angegebene Adresse zugeschickt. Bestätigen Sie bitte Ihre Registrierung.') 
      return redirect(url_for('register')) 
     else: 
      flash('Neuer Nutzer konnte nicht angelegt werden!') 
    except IntegrityError: 
     flash('Nutzer oder Email ist bereits vergeben, anderer Nutzername erforderlich') 
return render_template('register.html', form=form) 

Was ich brauche, ist ein Weg, um anzugeben, ob Benutzer oder E-Mail die throwed Integritätsfehler und die entsprechende Nachricht anzuzeigen.

Dank

+0

Sie‘ Ich muss zu "außer IntegrityError as e" wechseln und die tatsächliche Fehlermeldung überprüfen. – dirn

Antwort

1

wenn Sie wtf Formular verwenden, dann können Sie die Validate-Methode von NewUserForm

class NewUserForm(Form): 
    username = TextField('Username', [validators.Required()]) 

    def __init__(self, *args, **kwargs): 
     Form.__init__(self, *args, **kwargs) 
     self.user = None 

    def validate(self): 
     rv = Form.validate(self) 
     if not rv: 
      return False 

     user = User.query.filter_by(
      username=self.username.data).first() 
     if user is not None: 
      self.username.errors.append(' username taken ') 
      return False 

     self.user = user 
     return True 

während in Vorlage überschreiben Sie die Fehler wie folgt darstellen kann:

{% for field in form.errors %} 
{% for error in form.errors[field] %} 
    <div class="alert alert-error"> 
     <strong>Error!</strong> {{error}} 
    </div> 
{% endfor %} 
{% endfor %} 
+0

danke, es funktioniert – Roman

Verwandte Themen