サーチ…


備考

FlaskはBlinkerを使用してシグナルをサポートします。信号のサポートはオプションです。 Blinkerがインストールされている場合にのみ有効になります。

pip install blinker

http://flask.pocoo.org/docs/dev/signals/


信号は非同期ではありません。信号が送信されると、直ちに接続された各機能が順次実行されます。

信号に接続する

関数をシグナルに接続するには、シグナルのconnectメソッドを使用します。シグナルが送信されると、接続された各関数は、シグナルが提供する名前付き引数および送信者とともに呼び出されます。

from flask import template_rendered

def log_template(sender, template, context, **kwargs):
    sender.logger.info(
        'Rendered template %(template)r with context %(context)r.',
        template=template, context=context
    )

template_rendered.connect(log_template)

それらが提供する引数についてビルトインシグナルに関するドキュメントを参照してください。有用なパターンは、予期しない引数をとらえるために**kwargs引数を追加することです。

カスタム信号

独自のコードでシグナル作成して送信する場合(たとえば、エクステンションを作成する場合)、新しいSignalインスタンスを作成し、サブスクライバに通知する必要があるときにsendメソッドを呼び出しsend 。信号はNamespaceを使用して作成されます。

from flask import current_app
from flask.signals import Namespace

namespace = Namespace()
message_sent = namespace.signal('mail_sent')

def message_response(recipient, body):
    ...
    message_sent.send(
        current_app._get_current_object(),
        recipient=recipient,
        body=body
    )

@message_sent.connect
def log_message(app, recipient, body):
    ...

Blinkerを直接使用するよりFlaskのシグナルサポートを使用することをお勧めします。拡張機能を使用している開発者がBlinkerのインストールを選択していない場合、信号をオプションに残すようにライブラリをラップします。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow