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