Flask はメッセージ配信メカニズムであるシグナル機能を提供します。フックに似ています。シグナル関数を使用すると、プログラムの結合を減らし、複雑なビジネス モデルを分解できます。たとえば、製品データを更新した後にシグナルを送信できます。製品データを処理する必要がある機能がある場合、信号をキャプチャして処理できます。たとえば、商品キャッシュを作成したり、検索インデックスを更新したりする必要があります。
信号を定義する
Flask信号関数はBlinkerモジュールを使用するため、最初にBlinkerモジュールをインストールする必要があります
pip install blinker
信号を定義します:
from blinker import Namespace product_saved = Namespace()
Flaskパッケージを使用することもできますシングル オブジェクト:
from flask.singles import Namespace
シグナルの送信
シグナルの送信には、アプリインスタンスメソッドが必要です。 例は次のとおりです:
product_saved.send(app, product=product)
app 後で渡すパラメーターを追加できます。名前=値の形式である必要があります。単一の変数名の使用はサポートされていません。
シグナルを受信する
connect_via デコレーター関数を使用できます:
@product_saved.connect_via(app) def updateCache(app, product): print(product)
Flask には次のコアシグナルがあります:
1.flask.template_rendered
このシグナルはに送信されましたone テンプレートが正常にレンダリングされた後。シグナルによって渡されるテンプレートはテンプレートのインスタンスであり、コンテキストは辞書である環境オブジェクトです。
サブスクリプションの例:
def log_template_renders(sender, template, context, **extra): sender.logger.debug('Rendering template "%s" with context %s', template.name or 'string template', context) from flask import template_rendered template_rendered.connect(log_template_renders, app)
2.flask.request_started
このシグナルは、リクエストの開始前とリクエスト環境のセットアップ後に送信されます。リクエスト コンテキストはすでにバインドされているため、サブスクライバはリクエストなどの標準グローバル プロキシを使用してリクエストを操作できます。
サブスクリプションの例:
def log_request(sender, **extra): sender.logger.debug('Request context is set up') from flask import request_started request_started.connect(log_request, app) flask.request_finished
このシグナルは、クライアントに応答を送信する前に送信されます。シグナルによって渡される応答が、送信される応答です。
サブスクリプションの例:
def log_response(sender, response, **extra): sender.logger.debug('Request context is about to close down. ' 'Response: %s', response) from flask import request_finished request_finished.connect(log_response, app) flask.got_request_exception
このシグナルは、リクエスト中に例外が発生したときに送信されます。これは、標準の例外処理よりも早く送信されます。 デバッグ モードでは、例外処理はありませんが、例外が発生したときにもこのシグナルが送信されます。シグナルによって渡される例外は例外オブジェクトです。
サブスクリプションの例:
def log_exception(sender, exception, **extra): sender.logger.debug('Got exception during processing: %s', exception) from flask import got_request_exception got_request_exception.connect(log_exception, app) flask.request_tearing_down
このシグナルは、例外がスローされたかどうかに関係なく、リクエストがクラッシュしたときに送信されます。現在、このシグナルをリッスンする関数は一般的なクラッシュ ハンドラーの後に呼び出されますが、使用できるものはありません。
サブスクリプションの例:
def close_db_connection(sender, **extra): session.close()from flask import appcontext_tearing_down request_tearing_down.connect(close_db_connection, app)
Flask バージョン 0.9 では、exc キーワード引数 (存在する場合) も渡します。 このパラメータは、クラッシュの原因となった例外への参照です。
3.flask.appcontext_tearing_down
アプリケーション環境がクラッシュしたときにこのシグナルを送信します。このシグナルは、例外によるクラッシュの場合でも常に送信されます。このシグナルをリッスンする関数は通常のクラッシュ ハンドラーの後に呼び出されますが、このシグナルに応答することはできません。
サブスクリプションの例:
def close_db_connection(sender, **extra): session.close()from flask import request_tearing_down appcontext_tearing_down.connect(close_db_connection, app)
これは、exc キーワード引数 (存在する場合) も渡します。このパラメータは、クラッシュの原因となった例外への参照です。
4.flask.appcontext_pushed
アプリケーションのコンテキストがプッシュされると、アプリケーションはこのシグナルを送信します。この信号は通常、情報を一時的にフックするために単体テストで使用されます。たとえば、g オブジェクト内の既存のリソースを変更するために使用できます。
使用例:
from contextlib import contextmanagerfrom flask import appcontext_pushed @contextmanagerdef user_set(app, user): def handler(sender, **kwargs): g.user = user with appcontext_pushed.connected_to(handler, app): yield
テストコードにこれを書きます:
def test_user_me(self): with user_set(app, 'john'): c = app.test_client() resp = c.get('/users/me') assert resp.data == 'username=john' New in version 0.10.
5.appcontext_popped
アプリケーションのコンテキストがポップされると、アプリケーションはこのシグナルを送信します。この信号は通常、appcontext_tearing_down 信号として記述されます。
6.flask.message_flashed
このシグナルは、アプリケーションがメッセージをフラッシュするときに発行されます。 message` パラメータはメッセージの内容、category パラメータはメッセージのカテゴリです。
購読の例:
recorded = []def record(sender, message, category, **extra): recorded.append((message, category)) from flask import message_flashed message_flashed.connect(record, app)
概要
シグナルを使用すると、すぐに安全に購読できます。これらの一時的なサブスクリプションは、テストなどに役立ちます。シグナルを使用する場合、例外が発生するとプログラムが中断されるため、シグナル サブスクライバ (受信側) で例外が発生しないようにしてください。
Python の Flask フレームワークのシグナル シグナル メカニズムに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。