gpt4 book ai didi

python - 使用 Colander 验证 PATCH 请求

转载 作者:行者123 更新时间:2023-11-28 17:41:04 26 4
gpt4 key购买 nike

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

我正在使用 cornice 开发 RESTful web 服务,我最近发现了漏勺。我的问题与 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 代码简单。

@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 的神奇之处在于,它根据架构在 self.request.validated['organisation'] 中验证请求和位置的 json 主体。

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

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!')

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

什么是最好的解决方案?我是否坚持将完整且有效的记录修补到服务器,我是否定义了不同的模式或者我是否遗漏了什么?

最佳答案

老实说,我跳过了大部分问题,希望我没有漏掉任何太大的问题。

PUT 请求是否应该是完整记录 - 是的,绝对是。

PUT 请求将整个替换记录放在您请求的 URI 中。

如果您想执行部分修改,您应该使用 PATCH(令人惊讶的是鲜为人知)。在 PATCH 之前,理论是,GET 记录,本地修改,PUT 整个记录

关于python - 使用 Colander 验证 PATCH 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24203285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com