ホームページ >バックエンド開発 >Python チュートリアル >シグナル Python の Flask フレームワークのシグナル メカニズム

シグナル Python の Flask フレームワークのシグナル メカニズム

高洛峰
高洛峰オリジナル
2017-03-03 13:27:161401ブラウズ

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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。