EDIT: мой первоначальный вопрос относился к запросам PUT, я изменил его на PATCH на основе ответа, предоставленного thecoshman.
Я разрабатываю веб-сервис RESTful, используя карниз, и недавно обнаружил дуршлаг. Мой вопрос связан с запросами PATCH. Теперь я знаю, что запросы PUT должны быть полными записями, но не с запросами PATCH. Могу ли я использовать дуршлаг для проверки данных json, прикрепленных к запросу PATCH?
Дуршлаг отлично подходит для проверки запросов 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
или description
, тогда проверка завершится ошибкой, если запрос также не включает значение для orgname
, которое я не хочу менять.
Какое лучшее решение? Настаиваю ли я на том, чтобы полные и действительные записи были исправлены на сервере, я определяю другую схему или я что-то упускаю?