(機械翻訳) イベントの使用¶
*イベント*は、アプリケーションの存続期間中の興味深い点で、:app: `Pyramid`フレームワークによってブロードキャストされるオブジェクトです。ほとんどの:app: `Pyramid`アプリケーションを作成するためにイベントを使う必要はありませんが、やや高度な操作をしたいときに便利です。たとえば、イベントを購読すると、新しいリクエストごとにコードを実行できます。
のイベント:app: `Pyramid`は常にフレームワークによってブロードキャストされます。ただし、* subscriber *を登録するときにのみ有効になります。サブスクライバは、 `event`という単一の引数を受け付ける関数です。
1 2 | def mysubscriber(event):
print(event)
|
上記は、呼び出されたときにイベントをコンソールに単に出力するサブスクライバです。
しかし、単なる加入者機能の存在は、それが呼び出されるよう手配するだけでは不十分である。サブスクライバを呼び出すには、:meth: pyramid.config.Configurator.add_subscriber`メソッドを使用するか、:func: pyramid.events.subscriber`デコレータを使用してデコレートする必要がありますa:term: `scan`で見つかった関数です。
イベントリスナーの必須設定¶
あなたは、:meth: `〜pyramid.config.Configurator.add_subscriber`メソッドを介して、いくつかのイベントタイプに対して呼び出されるように加入者関数を設定することができます:
1 2 3 4 5 6 7 8 | from pyramid.events import NewRequest
from subscribers import mysubscriber
# "config" below is assumed to be an instance of a
# pyramid.config.Configurator object
config.add_subscriber(mysubscriber, NewRequest)
|
:meth: 〜pyramid.config.Configurator.add_subscriber`の最初の引数はサブスクライバ関数です(またはa:term:サブスクライバ呼び出し可能を参照する `点在するPython名 ')。 2番目の引数はイベントタイプです。
参考
term: `Configurator`も参照してください。
デコレータを使用したイベントリスナのコンフィグレーション¶
:func: `pyramid.events.subscriber`関数を使って、あるイベントタイプに対して呼び出されるようにサブスクライバ関数を設定することができます。
1 2 3 4 5 6 | from pyramid.events import NewRequest
from pyramid.events import subscriber
@subscriber(NewRequest)
def mysubscriber(event):
event.request.foo = 1
|
:func: 〜pyramid.events.subscriber`デコレータが使用されている場合、デコレータが何らかの効果を持つために、装飾された関数を含むパッケージに対して:term: scan`を実行する必要があります。
上記の登録例は、:app: Pyramid`フレームワークが:class: pyramid.events.NewRequest`インターフェースを提供するイベントオブジェクトを発行するたびに、 `` mysubscriber``関数が*イベント*オブジェクト。
ご覧のとおり、サブスクリプションは* class *(class: pyramid.events.NewResponse`など)の観点から行われます。サブスクライバに送信されるイベントオブジェクトは、常に:term: `interface`を持つオブジェクトです。 :class: `pyramid.events.NewResponse`の場合、そのインターフェースは:class: pyramid.interfaces.INewResponse`です。インタフェースのドキュメントは、イベントオブジェクトの利用可能な属性とメソッドに関する情報を提供します。
サブスクライバ関数の戻り値は無視されます。同じイベントタイプのサブスクライバは、互いに特定の順序で呼び出されることは保証されていません。
すべてのconcrete:app: Pyramid`イベントタイプは、:ref: events_module` APIドキュメントに記述されています。
例¶
アプリケーションの `` subscribers.py``ファイルにイベントリスナー関数を作成する場合は、次のようにします。
1 2 3 4 5 | def handle_new_request(event):
print('request', event.request)
def handle_new_response(event):
print('response', event.response)
|
適切なタイミングで呼び出されるようにこれらの関数を構成するには、アプリケーションの構成スタートアップに次のコードを追加します。
1 2 3 4 5 6 | # config is an instance of pyramid.config.Configurator
config.add_subscriber('myproject.subscribers.handle_new_request',
'pyramid.events.NewRequest')
config.add_subscriber('myproject.subscribers.handle_new_response',
'pyramid.events.NewResponse')
|
いずれのメカニズムによっても、 `` subscribers.py``の関数がイベントサブスクライバとして登録されます。この構成では、アプリケーションが実行されると、新しい要求または応答が検出されるたびに、メッセージがコンソールに出力されます。
各サブスクライバ関数は `` event``オブジェクトを受け取り、イベントオブジェクトの属性を出力します。これは、特定のイベントにどのような属性があるのか、どのようにして知ることができるのかという質問をします。
class: pyramid.events.NewRequest`イベントオブジェクトは:term: request`オブジェクトである `` request``属性を持っています。これはclass: pyramid.interfaces.INewRequest`で定義されているインタフェースです。それは必要であると言います。同様に、class: `pyramid.interfaces.NewResponse`イベントには、アプリケーションで構築されたレスポンスオブジェクトである response``属性があります:class: pyramid.interfaces.INewResponse`で定義されているインタフェースです。 (:class: pyramid.events.NewResponse`オブジェクトにも `要求'`がある)必要があります。
独自のイベントを作成する¶
Pyramidフレームワークが作成するイベントを使用することに加えて、アプリケーションで使用する独自のイベントを作成することもできます。これは、アプリケーションの一部を切り離すのに便利です。
たとえば、新しい文書が作成されたときにアプリケーションが多くのことを行う必要があるとします。ドキュメントを作成するビューにこのすべてのロジックを入れるのではなく、ビューでドキュメントを作成してカスタムイベントを発生させることができます。カスタムイベントの購読者は、ドキュメントの索引付け、電子メールの送信、リモートシステムへのメッセージの送信など、他のアクションを実行できます。
イベントは単なるオブジェクトです。カスタムイベントに必要な属性やメソッドはありません。一般的に、イベントは、加入者が必要とする情報を把握する必要があります。カスタムイベントクラスの例をいくつか示します:
1 2 3 4 5 6 7 8 9 10 11 | class DocCreated(object):
def __init__(self, doc, request):
self.doc = doc
self.request = request
class UserEvent(object):
def __init__(self, user):
self.user = user
class UserLoggedIn(UserEvent):
pass
|
いくつかのPyramidアプリケーションは、 `` events``モジュールでカスタムイベントクラスを定義することを選択します。
あなたは、必然的にまたはデコレータを使って、ピラミッドイベントを購読するのと同じ方法で、カスタムイベントを購読することができます。カスタムイベントは、:ref: `subscriber predicates <subscriber_predicates> `。デコレータを使用してカスタムイベントを購読する例を次に示します。
1 2 3 4 5 6 7 8 | from pyramid.events import subscriber
from .events import DocCreated
from .index import index_doc
@subscriber(DocCreated)
def index_doc(event):
# index the document using our application's index_doc function
index_doc(event.doc, event.request)
|
上記の例では、アプリケーションが `` DocCreated``イベントクラスと `` index_doc``関数を定義していることを前提としています。
カスタムイベントを発生させるには、:meth: pyramid.registry.Registry.notify`メソッドを使用します。このメソッドは、 `request.registry.notify``として最も頻繁にアクセスされます。例えば:
1 2 3 4 5 6 7 | from .events import DocCreated
def new_doc_view(request):
doc = MyDoc()
event = DocCreated(doc, request)
request.registry.notify(event)
return {'document': doc}
|
この例のビューは、すべてのサブスクライバにカスタムの `` DocCreated``イベントを通知します。
イベントを発生させると、すべてのサブスクライバが同期して実行されるので、実行に時間がかかるイベントハンドラを作成することは一般的にはお勧めできません。イベントハンドラは、独自のメッセージキューにタスクを生成する中心的な場所として使用できます。