从钩子回调中访问“app”(Eve对象)

时间:2014-10-13 19:43:20

标签: python eve

我在我的Eve应用程序中使用钩子来更新"摘要"每次将新项目添加到我的集合中时都会对象。为了保持清洁,我已经将我的回调移动到一个单独的目录/文件,我从run.py导入,我设置了钩子。

我的问题是我需要从我的回调函数(名为on_inserted_expense)中访问Eve()对象(我称之为" app")。我无法找到" eve"这样做的方式,所以我最终使用类似装饰器般的技巧,它起作用:

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 个答案:

答案 0 :(得分:1)

您可能希望遵循Larger Flask Application模式,以便在app中声明__init__.py对象,然后将其导入到您想要的任何位置。请记住,Eve只是一个Flask应用程序,所以无论你用Flask做什么,你都可以使用Eve。

答案 1 :(得分:1)

我一直这样做:

from flask import current_app

使用current_app作为应用。

参考:http://flask.pocoo.org/docs/0.10/api/#flask.current_app

我应该注意到这样做有什么陷阱吗?它似乎在添加钩子时起作用。