Python Eve: добавление пользовательского маршрута, изменение объекта вручную

Я только начал использовать Eve, и это действительно здорово для быстрого запуска полного REST API. Однако я не совсем уверен, что REST идеален во всех случаях, например. Я хотел бы иметь простой маршрут для голосования, где я могу увеличить счетчик объекта. Если я вручную извлекаю объект, увеличиваю значение счетчика и обновляю его, я легко могу столкнуться с проблемами рассинхронизации. Поэтому я хотел бы добавить простой дополнительный маршрут, например. /resource/upvote, который увеличивает количество голосов на единицу и возвращает объект.

Я не знаю, насколько это «хакерство», поэтому, если это чрезмерно, скажите мне. Я не вижу проблемы с наличием пользовательских маршрутов для некоторых важных задач, которые требуют слишком много работы для RESTful-способа. Я знаю, что могу рассматривать голоса как отдельный ресурс, но, эй, я думал, что мы делаем MongoDB, так что давайте не будем слишком реляционными.

Итак, вот, что я получил:

@app.route('/api/upvote/<type>/<id>')
def upvote(type, id):
    obj = app.data.find_one_raw(type, id)
    obj['score'] += 1
  • Проблема №1 find_one_raw всегда возвращает None. Я думаю, мне нужно преобразовать параметр id? (Я использую собственный ObjectId MongoDB)
  • Проблема №2 Как сохранить объект? Я не вижу удобного и простого в использовании метода, такого как save_raw
  • Проблема №3. Можем ли мы обернуть все это в транзакцию или что-то подобное, чтобы убедиться, что это потокобезопасно? (Я также новичок в MongoDB, как вы можете сказать).

person cpury    schedule 26.06.2015    source источник
comment
Я не уверен, как сделать пользовательский маршрут, но Ева имеет встроенную целостность данных и контроль параллелизма. python-eve.org/ Таким образом, вы получите сбой при попытке обновить (PATCH) ресурс, который уже был обновлен.   -  person Dustin    schedule 28.04.2016


Ответы (1)


1: type оказывается ключевым словом python. Вы хотите сказать что-то вроде resource_type ?

2: Есть app.data.insert (для создания нового) или app.data.update (для обновления существующего)

3: по-видимому, в mongodb нет транзакций, как видно из этот поток (как вы можете сказать, я сам новичок в mongodb)

person Mandar Vaze    schedule 29.07.2015
comment
1. Да, но это неважно! Вы можете локально перезаписать ключевые слова (не рекомендуется это делать). 2. Круто, спасибо! 3. Понятно... Спасибо за ссылку! - person cpury; 04.08.2015