0

バリデーターと水切りスキーマを持つビューを持つコーニス API があります。バリデーターでcolander 検証済みデータ ( ) にアクセスできませんrequest.validated

データをザルに渡します。私の水切りスキーマは次のようになります。

from colander import (
    MappingSchema,
    SchemaNode,
    String
)

class UserSchemaRecord(MappingSchema):
    username = SchemaNode(String())
    password = SchemaNode(String())

class UserSchema(MappingSchema):
    user = UserSchemaRecord()

リクエスト データのサニタイズされたバージョンが追加されrequest.validated['user']、このようにビューでアクセスできるようになります。

@view(renderer='json', validators=(valid_token, valid_new_username), schema=UserSchema)
def collection_post(self):
    """Adds a new user"""
    user_data = self.request.validated['user']
    user = UserModel(**user_data)
    DBSession.add(user)
    DBSession.flush()
    return {'user': user}

ただし、リクエストが一意のユーザー名を提供していることを確認し、ユーザー名が既に使用されている場合はエラーを返す必要もあります。これをバリデータ ( ) で実行したいのですが、バリデータvalid_new_usernameにアクセスしようとするとrequest.validated['user']、データがありません。

def valid_new_username(request):
    user = request.validated['user'] # this line fails with a KeyError
    username = user['username']
    if UserModel.get_by_username(username):
        request.errors.add('body', 'username', "User '%s' already exists!" % username)
        request.errors.status = 409 # conflict

データが抽出される前にバリデーターが呼び出されたようです。私は実際にはリクエスト json_body データに直接アクセスしたくありません。スキーマ/バリデーターの順序を変更する方法はありますか?

別の方法は、呼び出し可能ビューで直接チェックを行うことです。それは良い選択肢ですか?バリデーターはザルで検証されたデータを扱うべきではありませんか?

4

1 に答える 1

1

それがあなたの問題かどうかはわかりませんが、そもそもデータが有効でない場合 (Colander がエラーを検出した場合)、バリデーターで request.validated['key'] として利用できません。

データが Colander 検証に合格した場合にのみバリデーターを適用する場合は、このようなデコレーターを使用できます。

def when_valid(validator):
    """Decorator for validation functions.
    Only try validation if no errors already.

    """
    def inner(request):
        if len(request.errors) > 0:
            return
        validator(request)
    return inner

@when_valid
def valid_new_username(request):
    pass # your validation here
于 2015-09-14T12:57:28.177 に答える