2016-05-14 14 views
1

Ich frage mich, wo sollte ich ein Validierungsformular auf die Datenbank zugreifen. Grundsätzlich brauche ich Benutzer eingeben item_type und ich möchte zuerst überprüfen, ob die item_type in der Datenbank existiert.Code-Architektur - Flask - Wo Formularvalidierung aus der Datenbank?

Es gibt 3 Möglichkeiten:

  1. In dem Datenbank-Modell habe ich ItemType Klasse und ich habe Funktion add(), die, wenn das Element vorhanden ist oder nicht

  2. Im Hinblick hat bestehende überprüfen, so in die Route der Seite, von wtforms form.validate_on_submit(), ich mache eine Prüfung, um Daten aus der Datenbank zu bekommen, und wenn vorhanden, werde ich hier Fehler setzen

  3. In wtforms validate(), hinzufügen ing zusätzliche Validierung nach Standard Validierung der Form Klasse

ich Leute gesehen, habe mit Nummer 2 und 3, aber nicht sicher, welches das beste ist. Die Fehlermeldung, die ich will, muss sie auch auf dem spezifischen Feld des Formulars anzeigen (dies ist mit Methode 2 und 3 möglich, da sie auf das Formularfeld verweisen), aber wiederum, da sie mit dem Zugriff auf die Datenbank in Verbindung steht ist es besser, alles in Bezug auf den Datenbankzugriff auf Modellfunktionen zu setzen?

Antwort

2

Meiner Meinung nach, wenn es von einem Formular kommt, dann sollte es auf diesem Formular validiert werden und dann einen Fehler für dieses bestimmte Feld auslösen, wenn ungültig. Siehe Beispiel unten:

class SigninForm(Form): 
    """Form for signin""" 
    email = StringField('Email', 
         validators=[ 
          DataRequired("Email shouldn't be empty."), 
          Email('Email format is not correct.') 
         ]) 

    password = PasswordField('Password', 
          validators=[DataRequired("Password shouldn't be empty.")]) 

    def validate_email(self, field): 
     """ 
      verify if account exists and if not raise an error in 
      that field. 
     """ 
     user = User.query.filter(User.email == self.email.data).first() 
     if not user: 
      raise ValueError("Account doesn't exist.") 

    def validate_password(self, field): 
     """ 
      Verify if password is valid and if not raise an error in 
      that field. 
     """ 
     if self.email.data: 
      user = User.query.filter(User.email == self.email.data).first() 
      if not user or not user.check_password(self.password.data): 
       raise ValueError('Password is not correct.') 
      else: 
       self.user = user 

Die View-Funktion für dieses Beispiel:

@app.route('/signin', methods=['GET', 'POST']) 
def signin(): 
    """Signin""" 
    form = SigninForm() 
    if form.validate_on_submit(): 
     # sign in function to register user into a session 
     signin_user(form.user) 
     return redirect(url_for('site.index')) 
    return render_template('account/signin/signin.html', form=form) 
+0

Wenn Sie nicht 'validate_email' vorbei und' validate_password' in jedem jeweiligen Feld Konstruktor als benutzerdefinierte Validatoren, wie/wann werden sie gerufen? Gibt es etwas automatisch Magisch passiert als Folge der Benennung Ihrer Methode plus Erben der WTForm Form? – afilbert