编辑:我最初的问题涉及 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}
schema=OrganisationSchema
验证请求和位置的 json 主体的神奇之处在于self.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 请求以更新fullname
ordescription
字段,则验证将失败,除非该请求还包含orgname
我不想更改的值。
什么是最好的解决方案?我是否坚持将完整和有效的记录修补到服务器,我是否定义了不同的模式或者我错过了什么?