2

コレクションに新しいアイテムが追加されるたびに、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 から現在の「アプリ」オブジェクトを取得する方法はありますか? そうでない場合、おそらくシングルトンの方法で、追加する価値のあるものでしょうか? ありがとう!

4

2 に答える 2

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 に答える
1

おそらくLarger Flask Application patternに従いたいので、appオブジェクトを宣言して__init__.py、好きな場所にインポートできます。Eve は単なる Flask アプリケーションであるため、Flask でできることはすべて Eve で行うことができます。

于 2014-10-14T06:53:15.363 に答える