отправить запрос (опубликовать) внутри в python-eve

У меня есть ресурс в e.g. ABC, я хочу манипулировать другим ресурсом, например. BCD, когда выполняется какое-то условие, когда я публикую новый элемент в ABC, я знаю, что могу перехватить событие для post/pre_POST_ABC, но есть ли «внутренний» способ сделать публикацию в BCD без повторного прохождения через HTTP?


person John    schedule 05.03.2014    source источник


Ответы (1)


В вашей функции обратного вызова вы можете:

А) использовать драйвер данных для хранения данных непосредственно в базе данных

Что-то вроде этого:

def update_ABC(request, payload):    
    accounts = app.data.driver.db['abc_collection']
    account = accounts.insert(docs)

app = Eve()
app.on_post_POST_ABC += update_ABC
app.run()

Сделал бы трюк. Таким образом вы обойдете структуру и сохраните непосредственно в базе данных.

B) Используйте app.test_client.post() для POST напрямую через приложение.

app.test_client().post('/bcd', json.dumps({"field":"value"}, content_type='application_json'))

Это, вероятно, лучший вариант, поскольку запрос проходит через фреймворк (метаполя, такие как data_created, обрабатываются за вас.)

Обновление: в версии 0.5+ теперь вы можете использовать post_internal для достижения того же результата. Существуют эквивалентные внутренние методы, доступные и для других методов CRUD.

person Nicola Iarocci    schedule 05.03.2014
comment
Вариант 2 - это именно то, что я ищу, однако, похоже, он не работает? app.post - это тип экземпляра, а не функция? - person John; 06.03.2014
comment
Я также пытался сделать request.post(url, data, headers), но он зависает накануне .... однако использование запросов не идеально, так как будут некоторые накладные расходы на http. в идеале вызвать какую-то внутреннюю функцию eve, чтобы сделать пост? - person John; 06.03.2014
comment
Я понимаю, @nicola-iarocci, я могу сделать eve.methods.post, однако при таком подходе некоторые связанные с ним обработчики событий больше не работают, например. on_post_POST_BCD не срабатывает, не могли бы вы посоветовать? Благодарность - person John; 06.03.2014
comment
Я исправил фрагмент для варианта 2. Извините за это. - person Nicola Iarocci; 06.03.2014
comment
Благодарность! Работает как часы! кстати, так что мы можем узнать об этом трюке, только прочитав код или .. спросив в stackoverflow? - person John; 06.03.2014
comment
Дело в том, что test_client() — это функция Flask, а не Eve. В документах я сосредоточился на функциях Eve. Но да, я добавлю руководство для разработчиков, как только фреймворк станет достаточно зрелым. - person Nicola Iarocci; 06.03.2014
comment
Для варианта Б) мне нужно было добавить следующее: app.test_client().post('/bcd', data=json.dumps({"field":"value"}), content_type='application/json') - person kynan; 22.04.2014