2

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

我的问题是我需要从我的回调函数(名为 on_inserted_expense)中访问 Eve() 对象(我称之为“app”)。我找不到“前夕”的方式来做到这一点,所以我最终使用了类似装饰器的技巧,它有效:

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 检索当前的“应用程序”对象?如果不是,那是否值得添加,也许是以单身的方式?谢谢!

4

2 回答 2

1

您可能希望遵循Larger Flask Application模式,因此您可以在您的app对象中声明您的对象__init__.py,然后您可以将它导入到您想要的任何地方。请记住,Eve 只是一个 Flask 应用程序,因此您可以用 Flask 做的任何事情,通常都可以用 Eve 做。

于 2014-10-14T06:53:15.363 回答
1

我一直在这样做:

from flask import current_app

current_app用作应用程序。

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

我应该注意这样做的陷阱吗?添加钩子时似乎有效。

于 2014-10-25T18:53:03.533 回答