Я использую хуки в своем приложении Eve для обновления объекта «сводка» каждый раз, когда в мою коллекцию добавляется новый элемент. Чтобы все было в порядке, я переместил свои обратные вызовы в отдельный каталог / файл, который я импортирую из run.py, где я настроил хуки.
Моя проблема в том, что мне нужно получить доступ к объекту Eve () (который я назвал «приложением») из моей функции обратного вызова (с именем on_inserted_expense). Я не мог найти "канун" способ сделать это, поэтому в итоге я использовал что-то вроде этого трюка в стиле декоратора, который работает:
from eve import Eve
from eventhooks import posthooks
from functools import wraps
app = Eve()
def passing_app(f):
@wraps(f)
def wrapper(*args, **kwargs):
kwargs['app'] = app
return f(*args, **kwargs)
return wrapper
app.on_inserted_expenses += passing_app(posthooks.on_inserted_expense)
Таким образом из eventhooks / posthooks.py я могу:
def on_inserted_expense(items, **kwargs):
app = kwargs['app']
for item in items:
summaries = app.data.driver.db['summaries']
summary = summaries.find_one({'title': 'default'})
if not item_in_summary(item, summary):
with app.test_request_context():
update = update_summary(summary, item)
patch_internal(summary, payload=update, concurrency_check=True)
Поэтому мой вопрос: есть ли способ получить текущий объект «приложение» из Eve более чистым способом из любого места в приложении? Если нет, стоит ли это добавить, может быть, в виде синглтона? Спасибо!