【发布时间】:2015-12-09 19:20:29
【问题描述】:
我有一个带有验证器和滤锅架构的视图的檐口 API。我无法访问验证器中的漏勺验证数据 (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 数据。有没有办法可以更改模式/验证器的顺序?
另一种方法是直接在我的视图可调用中进行检查。这是一个不错的选择吗?验证器不应该使用过滤器验证的数据吗?
【问题讨论】:
标签: validation pyramid colander cornice