我在我的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的对象?如果没有,这是否值得添加,也许是单身人士的方式?谢谢!
答案 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
我应该注意到这样做有什么陷阱吗?它似乎在添加钩子时起作用。