Использование уровня базы данных Eve без HTTP

В моем приложении коллекции MongoDB необходимо обновлять с помощью задания сценария на стороне сервера (IE: задание cron, которое очищает/извлекает из других API каждые 30 минут). Что я действительно хочу сделать, так это обновить коллекции MongoDB, но проверить данные по схеме и включить метаданные (обновленные, созданные и т. д.).

Два способа, которые приходят на ум, чтобы решить эту проблему:

  1. Иметь поддельный клиент для выполнения HTTP POST/PUT/PATCHES. Однако это означает, что этому поддельному клиенту придется иметь дело с такими вещами, как аутентификация/авторизация/последнее изменение с момента.
  2. Используйте PyMongo для прямого взаимодействия с БД. Однако это означает, что у меня не будет проверки данных или сохраненных метаданных.

Есть ли у Eve перехватчики для базы данных, чтобы я мог выполнять полноценные обновления базы данных Eve без HTTP?


eve
person KFunk    schedule 15.08.2014    source источник


Ответы (3)


Я смог запустить это в отдельном скрипте, который может периодически запускаться jenkins. Приложение из run.py, которое я импортирую, — это то, которое у меня было к концу краткого руководства по eve.

from run import app
from eve.methods.post import post_internal

payload = {
    "firstname": "Ray",
    "lastname": "LaMontagne",
    "role": ["contributor"]
}

with app.test_request_context():
    x = post_internal('people', payload)
    print(x)

post_internal запускает eve.utils.parse_request, который зависит от flask.request, поэтому требуется with app.test_request_context(). app.app_context() недостаточно для этого метода.

Прочитайте документы для appcontext и reqcontext, если вы новичок в flask (как и я).

person KFunk    schedule 25.08.2014
comment
Теперь доступны put_internal, patch_internal, deleteitem_internal. - person KFunk; 24.09.2014

Начиная с версии 0.5 (в настоящее время в ветке разработки, но вы можете сразу использовать ее) вы можете использовать post_internal для добавления данных:

   Intended for internal post calls, this method is not rate limited,
   authentication is not checked and pre-request events are not raised.
   Adds one or more documents to a resource. Each document is validated
   against the domain schema. If validation passes the document is inserted
   and ID_FIELD, LAST_UPDATED and DATE_CREATED along with a link to the
   document are returned. If validation fails, a list of validation issues
   is returned.

Вероятно, было бы целесообразно добавить больше внутренних методов для покрытия всех операций CRUD, которые теперь доступны через HTTP. Однако вы все равно можете вызвать их сразу.

Обновление: выпущена версия 0.5 с _internal методами, доступными для всех операций CRUD.

person Nicola Iarocci    schedule 15.08.2014
comment
Великолепно! Я могу следовать шаблону post vs post_internal для размещения/исправления/удаления. - person KFunk; 15.08.2014
comment
2 дополнительных вопроса: 1) Любые предложения по взаимодействию с flask/eve из отдельного скрипта .py? Этот ответ кажется, что он будет работать, но не нравится идея создания конечной точки http только для внутренней задачи, а затем вводить логику, чтобы не пускать других. 2) Создания put_internal способом создания post_internal будет недостаточно из-за ограничения etag/IF_MATCH, имеющего место в get_document. - person KFunk; 18.08.2014
comment
На 2) вы можете поэкспериментировать с отключением сопоставления etag через конфигурацию (даже временно). Я планирую изучить это и посмотреть, смогу ли я придумать новые «внутренние» методы редактирования. 1) никогда не пробовал это, но это сработает, если вы, конечно, попадете на веб-сервер; или вы могли бы использовать гринлет/сельдерей что-то вроде этого, я думаю? Не думайте, что фляга поддерживает это изначально (хотя это не моя область). - person Nicola Iarocci; 18.08.2014
comment
Да, я подумал, что 1) может быть больше вопросом о фляжке. что касается 2), возможно, реализация сравнения etag в качестве декоратора упростит обход с помощью internal_put/delete/patch. - person KFunk; 18.08.2014

Если вы хотите сделать следующее в пользовательской конечной точке...

  1. принять некоторые POSTed данные
  2. как-то манипулировать данными
  3. выполнить post_internal()
  4. вернуть результат в качестве ответа

... вы бы сделали это примерно так:

from eve.methods.post import post_internal
from eve.render import send_response

def my_custom_endpoint(**kwargs):

    data = json.loads(request.data.decode())

    # <manipulate data here>    

    resp = post_internal('crew', data)
    return send_response('crew', resp)

На самом деле вам, вероятно, лучше использовать Event Hooks от Eve, чтобы сделать это. вещи. Но в случае, если есть какая-то ситуация, которую Event Hooks не охватывает, этот подход может быть полезен.

person amorphic    schedule 13.05.2016