Доступ к приложению (объекту Eve) из обратных вызовов хуков

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


person Adrian    schedule 13.10.2014    source источник


Ответы (2)


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

person Nicola Iarocci    schedule 14.10.2014
comment
Спасибо, Никола! Это определенно сработает, и я воспользуюсь им, если у меня возникнет необходимость ссылаться на объект приложения из других точек приложения за пределами хуков. Я никогда не был фанатом объявления объектов в __init__.py. Циклическая ссылка, которую он создает в этом случае, безобидна, но все же уродлива. Спасибо за быстрый ответ :) - person Adrian; 14.10.2014

Я делал это:

from flask import current_app

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

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

Есть ли подводные камни, о которых я должен знать? Вроде работает при добавлении хуков.

person Bill Ryder    schedule 25.10.2014