#python #validation #rest #colander #http-patch
#python #проверка #отдых #дуршлаг #http-patch
Вопрос:
РЕДАКТИРОВАТЬ: мой первоначальный вопрос относился к запросам PUT, я изменил его на PATCH на основе ответа, предоставленного thecoshman.
Я разрабатываю веб-сервис RESTful с использованием cornice и недавно обнаружил дуршлаг. Мой вопрос связан с запросами на ИСПРАВЛЕНИЕ. Теперь я знаю, что запросы PUT должны быть полными записями, но не так с запросами на ИСПРАВЛЕНИЕ. Могу ли я использовать дуршлаг для проверки данных json, прикрепленных к запросу на ИСПРАВЛЕНИЕ?
Дуршлаг отлично подходит для проверки 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!')
Однако, если я хочу обработать запрос на ИСПРАВЛЕНИЕ для обновления полей fullname
или description
, то проверка завершается неудачей, если запрос также не содержит значения orgname
, которое я не хочу изменять.
Какое лучшее решение? Настаиваю ли я на том, чтобы полные и действительные записи исправлялись на сервере, определяю ли я другую схему или я что-то упускаю?
Ответ №1:
честно говоря, пропустил большую часть вопроса, так что, надеюсь, я не пропустил ничего слишком большого.
Should PUT requests be full records
— Да, безусловно.
Запросы PUT помещают всю запись замены в запрошенный вами URI.
Если вы хотите выполнить частичную модификацию, вам следует использовать PATCH (который на удивление менее известен). Перед ИСПРАВЛЕНИЕМ теория заключалась бы в том, чтобы ПОЛУЧИТЬ запись, изменить локально, ВЕРНУТЬ всю запись обратно
Комментарии:
1. Вы правы, поэтому я думаю, что мне нужно обновить свой вопрос, поскольку я, вероятно, имел в виду запросы на ИСПРАВЛЕНИЕ.
2. Если ваш сервер может (как кажется в настоящее время) поддерживать только полные записи, тогда принимайте их как запросы PUT. Затем вы можете позже поработать над поддержкой ИСПРАВЛЕНИЯ.
3. Это то, что я сделал. Мне все еще интересно, как подойти к проверке данных ИСПРАВЛЕНИЯ с помощью дуршлага
4. @GraemeStuart Я предполагаю, что вам нужно иметь альтернативную схему, в которой каждый элемент помечен как
missing=colander.drop, default=colander.drop
, чтобы отсутствующие элементы не отключали этап проверки. Тогда будут проверены только те элементы, которые существуют, а отсутствующие элементы будут проигнорированы. Вы, вероятно, также должны убедиться, чтоunknown
значение вcolander.Mapping
установлено'raise'
таким образом, значения, которые не соответствуют элементу схемы, вызывают ошибку.5. Спасибо, Тим. Кажется немного странным и не очень СУХИМ иметь две похожие схемы для одного и того же ресурса, но я думаю, это единственный способ.