バリデーターと水切りスキーマを持つビューを持つコーニス 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 データに直接アクセスしたくありません。スキーマ/バリデーターの順序を変更する方法はありますか?
別の方法は、呼び出し可能ビューで直接チェックを行うことです。それは良い選択肢ですか?バリデーターはザルで検証されたデータを扱うべきではありませんか?