Фреймворк Eve: хук on_update

Я использую платформу Eve для службы REST API. Также я использую перехватчики БД для предварительной обработки перед некоторыми действиями: http://python-eve.org/features.html#database-event-hooks

Мой вопрос: нужно ли мне сохранять в базе данных мои обновленные данные в хуке on_update или достаточно обновить элемент original с помощью updates, например:

original.update(updates)

или нужно сохранить эти данные как-то так:

updated_item = original.update(updates)
# Fetch somehow requested resource from `resource_name` and do staff like this:
updated_resource = RequestedResource(updated_item)
updated_resource.commit()

Или есть какой-то лучший/больше EVE способ?

Кстати, я делаю запросы:

requests.patch("http://127.0.0.1:7000/users/2", headers=headers, json={"name": "John", "age": 30})

person smart    schedule 15.05.2017    source источник


Ответы (1)


В вашем хуке on_update вам просто нужно добавить/изменить данные, которые вы хотите изменить, в updates dict, полученном в качестве параметра. В это время он уже будет включать тело запроса PATCH, и это то, что будет отправлено в обновление.

Ресурс original содержит обновляемый ресурс и может использоваться для справки, но менять его бесполезно.

person gcw    schedule 16.05.2017
comment
Итак, когда я отправляю упомянутый выше запрос с помощью requests, в updates у меня есть {"name": "John", "age": 30}, а в моем original исходные данные. Но когда я получаю тот же элемент во второй раз, он содержит мои старые данные (не обновляются) - person smart; 16.05.2017
comment
Что такое ответ HTTP для PATCH? Похоже, он получает некоторую ошибку проверки, потому что это должно работать. Вы используете/отправляете заголовок etag? - person gcw; 16.05.2017
comment
('сообщение:', u'{created_at: 2017-03-24T09:08:05, _status: OK, _links: {self: {href: users/2, title: User}}, updated_at: 2017-05-16T12 :20:46, идентификатор: 2}') ('статус: ', 200) - person smart; 16.05.2017
comment
Если вы попытаетесь запросить ресурс после PATCH с помощью другого инструмента, такого как postman или curl, это сработает? Вы проверили слой данных напрямую, чтобы увидеть измененные данные? - person gcw; 16.05.2017
comment
Я также отправил запрос с помощью curl, одно из измененных полей не обновляется (другого в ответе нет) - person smart; 16.05.2017
comment
извините, работает! Я пытался обновить поле updated_at, и оно действительно не изменилось. - person smart; 16.05.2017
comment
Хороший! Да, эти метаполя _created, _updated задаются внутри Евы, и вы не можете установить для них то, что хотите. - person gcw; 16.05.2017