Использование дуршлага для проверки запросов на ИСПРАВЛЕНИЕ

#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. Спасибо, Тим. Кажется немного странным и не очень СУХИМ иметь две похожие схемы для одного и того же ресурса, но я думаю, это единственный способ.