使用Colander验证PATCH请求

时间:2014-06-13 10:32:57

标签: python validation rest colander http-patch

编辑:我原来的问题提到了PUT请求,我已根据thecoshman提供的答案将其更改为PATCH。

我正在使用檐口开发RESTful网络服务,我最近发现了漏勺。我的问题与PATCH请求有关。我现在知道PUT请求应该是完整记录,但PATCH请求不是这样。我可以使用漏勺来验证附加到PATCH请求的json数据吗?

Colander非常适合验证POST请求,因为它确保我在json中拥有所有正确的数据,并且还可以删除任何无关的数据。

这是我的简单架构。

class OrganisationSchemaRecord(MappingSchema):
    orgname = SchemaNode(String())
    fullname = SchemaNode(String())
    description = SchemaNode(String(), missing=drop)

class OrganisationSchema(MappingSchema):
    organisation = OrganisationSchemaRecord()

这使我可以保持我的视图代码简单。

@view(validators=(unique,), renderer='json', schema=OrganisationSchema)
def collection_post(self):
    """Adds a new organisation"""
    org = DBOrg(**self.request.validated['organisation'])#sqlalchemy model
    DBSession.add(org)
    return {'organisation': org}

根据模式,验证请求和地点的json正文的schema=OrganisationSchemaself.request.validated['organisation']

它也适用于我的其他验证器,确保主键尚未使用。

def unique(request):
    if 'organisation' in request.validated: #Implies a validated schema
        orgname = request.validated['organisation']['orgname']
        if DBSession.query(DBOrg).get(orgname):
            request.errors.add('url', 'orgname', 'This organisation already exists!')

但是,如果我想处理PATCH请求以更新fullnamedescription字段,则验证将失败,除非请求还包含我不想要的orgname值改变。

什么是最佳解决方案?我是否坚持要将完整且有效的记录修复到服务器,我是否定义了不同的模式,还是我遗漏了某些内容?

1 个答案:

答案 0 :(得分:2)

老实说,跳过大部分问题,所以希望我没有错过任何太大的东西。

Should PUT requests be full records - 是的,绝对。

PUT请求将完整的替换记录放在您请求的URI上。

如果要执行部分修改,则应使用PATCH(其知名度较低)。在PATCH之前,理论将是,获取记录,在本地修改,PUT整个记录回来