コレクションに新しいアイテムが追加されるたびに、Eve アプリでフックを使用して「概要」オブジェクトを更新しています。物事をきれいに保つために、フックを設定した run.py からインポートする別のディレクトリ/ファイルにコールバックを移動しました。
私の問題は、コールバック関数 (on_inserted_expense という名前) 内から 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 から現在の「アプリ」オブジェクトを取得する方法はありますか? そうでない場合、おそらくシングルトンの方法で、追加する価値のあるものでしょうか? ありがとう!