【问题标题】:pyramid/cornice validators and colander schema金字塔/檐口验证器和滤锅模式
【发布时间】: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


    【解决方案1】:

    不确定这是否是您的问题,但如果数据一开始就无效(漏勺发现错误),那么它在验证器中将无法作为 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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2012-10-03
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多