Прикосновение «app» (объект Eve) от обратных вызовов hook

Я использую hooks в своем приложении 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 более чистым способом из любого места приложения? Если нет, может быть, это что-то стоит добавить, может быть, на пути синглтона? Благодаря!

    2 Solutions collect form web for “Прикосновение «app» (объект Eve) от обратных вызовов hook”

    Вероятно, вы захотите следовать шаблону приложения Larger Flask , чтобы ваш объект app объявлен в вашем __init__.py а затем вы можете импортировать его в любом месте. Помните, что Eve – это просто приложение с флягой, поэтому, что бы вы ни делали с Flask, вы можете вообще с Eve.

    Я делаю это:

     from flask import current_app 

    И использование current_app в качестве приложения.

    Ссылка: http://flask.pocoo.org/docs/0.10/api/#flask.current_app

    Есть ли подводные камни, которые я должен знать об этом? Кажется, что он работает при добавлении крючков.

     
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.