3

プロジェクトの 1 つでPyramidを使い始めたばかりで、フォーム フィールドの値を取得して Web サービス呼び出しを行い、値の正確性を確認することで、フォーム フィールドの入力を検証する必要がある場合があります。たとえば、銀行の CUSTOMER-ID というフィールドがあります。それを(単独で)入力として受け取り、(のような)Webサービス呼び出しを行うことでサーバーレベルで検証する必要がありhttp://someotherdomain/validate_customer_id/?customer_id=<input_value>ます。

フォーム スキーマ管理にはColanderを使用し、すべてのフォーム検証ロジックにはDeformを使用しています。CUSTOMER-ID ケースの検証ロジックをどこに配置する必要があるかについて混乱しています。それはMySchema().bind(customer_id=<input_value>)(Webサービスを照会する遅延バリデーターを持っている)にありますか、それとも form.validate(request.POST.items()) にありますか? 延期されたバリデーターのパスを使用すると、 MySchema().bindCUSTOMER colander.Invalid-ID が正しくないというエラーが発生します。それはいいです。しかし、そのエラーはフォーム レベルではなく、スキーマ レベルにあります。では、これについてユーザーに適切に伝えるにはどうすればよいでしょうか。

私は Django フォームの経験が豊富なので、cleanメソッドのようなものを期待していました。form['customer_id'].error のようなフォーム エラーは、テンプレート レベルで期待しているものです。Pyramid の Deform または Colander で可能ですか?

4

2 に答える 2

9

したがって、あなたが抱えている大きな問題は、Colander と Deform の関心の分離を理解することだと思います。Colander は、一般的なスキーマ検証ライブラリと呼ばれるものです。これは、各ノードが特定のデータ型を持ち、一部のノードが必須/オプションであるスキーマを定義することを意味します。その後、Colander はそのスキーマを検証し、colander に渡したデータがそのスキーマに準拠しているかどうかを教えてくれます。例として、私の Web アプリでは、検証が必要な GET/POST パラメーターを受け入れる API を構築することがよくあります。Pyramid では、次のシナリオがあるとします。

request.POST = {
    'post_id': 1,
    'author_id': 1,
    'unnecessary_attr': 'stuff'
}

次に、次のように検証できます。

# schema
schema = SchemaNode(Mapping(),
                    SchemaNode(Integer(), name='post_id'),
                    SchemaNode(Integer(), name='author_id'))
schema.deserialize(request.POST)

また、データを指定されたスキーマに準拠させることができない場合はエラーになります。お分かりのように、colander は、POST/GET/JSON データからのものであるかどうかにかかわらず、データのセットを検証するために実際に使用できます。一方、Deform はフォーム ライブラリであり、フォームの作成/検証に役立ちます。検証のすべてのニーズに colander を使用し、ご覧のとおり、ほとんど完全に検証を colander に委任します。したがって、あなたの質問に答えるには、すべての検証作業をザルで行い、変形は主にフォームのレンダリングを処理します。

于 2014-01-07T08:06:09.607 に答える
2

IndyPy Python Web Shootoutの一部としてtodopyramidを見て、鮮やかなピラミッドのサンプル アプリケーションと変形の動作を確認してください。Todo アプリケーションは、ピラミッド、ジャンゴ、フラスコ、ボトルに実装されました。私はピラミッドの例を研究しました - それはよく書かれており、変形スキーマの検証を示し、ブートストラップを使用して検証メッセージを表示します。

ここでピラミッドのチュートリアルをもっと見つけてください:

于 2014-01-07T16:13:24.847 に答える