2

多くのアプリがFormオブジェクトを使用してデータを検証し、データをモデルに渡しますが、モデルには検証をまったく入れていません。コンテキストに関係なく実行するには、モデル自体にコア検証を配置する方が良いと思います(たとえば、18歳未満のユーザーはいない)。言い換えれば、ユーザーがどのように作成されているか(Web UIまたはコマンドラインを介して)は関係ありません。コアルールは常に適用される必要があります。

SQLAlchemy(Pyramidアプリケーション内)を使用しています。フォーム(WTForms)が常にモデルで定義されたコアルールを尊重し、すべてのデータが一貫するように、モデル内でコア検証ルールを定義したいと思います。

他の誰かがすでにこれをやっていますか、それとも似たようなことですか?

このphpソリューションに似たもの。

4

1 に答える 1

2

SQLAlchemyを使用すると、特定のイベントが発生したときに呼び出されるリスナーを登録できます。たとえば、モデルのフィールドが変更されたときにトリガーされるイベントを登録できます。SQLAlchemyのドキュメントから:

リスナーには、retval = Trueフラグがlisten()に渡されたときに、変更された可能性のあるバージョンの値を返すオプションがあります。

def validate_phone(target, value, oldvalue, initiator):
    "Strip non-numeric characters from a phone number"

    return re.sub(r'(?![0-9])', '', value)

# setup listener on UserContact.phone attribute, instructing
# it to use the return value 
listen(UserContact.phone, 'set', validate_phone, retval=True)

上記のような検証機能でもValueError、操作を停止するなどの例外が発生する可能性があります。

したがって、ご覧のとおり、モデルレベルで特定のフィールドの値を変更または拒否できます。

フォームライブラリがこの機能と統合されているかどうかはわかりませんが、独自のソリューションを展開するのはそれほど難しいことではありません。

于 2012-06-30T21:31:09.607 に答える