2017-06-07 5 views
1

Ich habe mehrere Fragen dazu gelesen und ich weiß noch nicht, was die beste Lösung für dieses Problem ist. Angenommen, wir ein Modell wie dieses:Sqlalchemy Fehlerbehandlung und benutzerdefinierte Validierungen

from sqlalchemy import Column, Integer, String 

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    email = Column(String, unique=True) 
    fullname = Column(String) 
    password = Column(String, nullable=False) 

In meinem Controller, ich möchte einen Benutzer erstellen, während Parameter Validierung und sqlalchemy Fehlerbehandlung auf diese Anfrage zu beantworten.

Validierungsprüfungen:

  1. E-Mail uniqeness
  2. Passwort nicht null sein kann
  3. Passwort mindestens 6 Zeichen lang sein.

für Validierung Nummer 3, können wir validates Decoraor verwenden. für die erste 2 Validierung, können wir diesen Benutzer hinzufügen und commit und irgendwie sqlalchemy.exc.SQLAlchemyError Fehler analysieren, die ausgelöst wird.

Aber ich mag diesen Weg wirklich nicht. weil es ist so schmutzig und nicht skalierbar. Einige Validierungen wie uniqeness müssen nach db abfragen. überprüft aber, ob ein Wert null ist, muss nicht nach db abfragen und sqlAlchemyError analysieren.

Was ist der beste Weg, um verschiedene Arten der Validierung zu behandeln?

Was ist die beste Methode zum Parsen von sqlAlchemyError-Nachrichten und zum Zurücksenden von korrekten HTTP-Statuscodes an Clients?

+0

Wie ist es nicht skalierbar? –

Antwort

2

Je nachdem, was Sie planten, mit Ihrer Anwendung zu tun, um die hervorragenden Validierungsfunktionen von wtforms nutzen könnte:

from flask_wtf import Form 
from wtforms import StringField, PasswordField, SubmitField 
from wtforms.fields.html5 import EmailField 
from wtforms.validators import Length, Required, Email, EqualTo 

class FooForm(Form): 
    email = EmailField('Email', validators=[Required(),Email()]) 
    fullname = StringField('Name', validators=[Required(), Length(64)]) 
    password = PasswordField('Password', validators=[Required(), EqualTo('password2', message='Passwords must match.'), Length(8)]) 
    password2 = PasswordField('Password (confirm)', validators=[Required(),Length(8)]) 
    submit = SubmitField('Submit') 

, das für Ihre Validierung nimmt userinput - wenn etwas nicht die Anforderungen passt wird es fangen Sie die Fehler vor irgendeiner Art von Anfrage zum backand ab. Für die E-Mail-Uniquenes würde ich vorschlagen, die sqla-Transaktion in "try: ... excepted:" einzufügen, um den Fehler zu erkennen und eine entsprechende Nachricht an den Benutzer zu senden. Oder Sie könnten Ihren eigenen wtforms Validator wie beschrieben here schreiben. Sie könnten beispielsweise eine Ajax-Anfrage an das Backend senden und prüfen, ob die betreffende Emailadresse bereits vergeben ist.

Verwandte Themen