2017-06-07 28 views
1

私はこれに関するいくつかの質問を読んだが、私はまだこの問題のための最良の解決策を知らない。私たちはこのようなモデルがあるとします。パラメータを検証し、この要求に応答しSQLAlchemyのエラーを処理しながら、私のコントローラでSqlalchemyのエラー処理とカスタム検証

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) 

を、私は、ユーザーを作成します。

検証チェック:

  1. 電子メールuniqeness
  2. パスワードがnull
  3. パスワードは6文字以上でなければならないことはできません。

検証番号3の場合、デコレータの検証に使用できます。 最初の2つの検証では、このユーザーを追加してコミットし、何らかの理由でsqlalchemy.exc.SQLAlchemyErrorエラーを解析します。

しかし、私は本当にこのように好きではありません。 だから汚いはスケーラブルではないのでです。 uniqenessのようないくつかのバリデーションはdbに問い合わせる必要があります。値がNULLであるかどうかを確認するために、dbにクエリしてsqlAlchemyErrorを解析する必要はありません。

さまざまなタイプの検証を処理する最も良い方法は何ですか?

sqlAlchemyErrorメッセージを解析し、適切なHTTPステータスコードをクライアントに返す最適な方法は何ですか?

+0

どのようにスケーラブルではありませんか? –

答えて

2

あなたがwtformsの優れた検証機能を使用することができ、あなたのアプリケーションで行うことを計画している内容に応じて:

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

あなたのユーザ入力の検証の世話をする - 何かが、それは意志の要件に適合しない場合どんな種類の要求であっても、バックエンドへのエラーが発生する前にそのエラーをキャッチします。電子メールuniquenesについては、私はエラーをキャッチし、それぞれのメッセージをユーザーにフラッシュする "try:... except:"でsqlaトランザクションをラップすることを提案します。 hereのように独自のwtformsバリデーターを書くことができます。 たとえば、ajaxリクエストをバックエンドに送信して、問題のemailaddressがすでに使用されているかどうかを確認できます。

関連する問題