每次将新项目添加到我的集合中时,我都会在我的 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 检索当前的“应用程序”对象?如果不是,那是否值得添加,也许是以单身的方式?谢谢!