ホームページ > バックエンド開発 > Python チュートリアル > Djangoのオブザーバーパターンの詳しい説明

Djangoのオブザーバーパターンの詳しい説明

Y2J
リリース: 2017-05-13 13:47:00
オリジナル
1983 人が閲覧しました

フレームワークが操作を実行するときに分離するために、Django には「シグナルディスパッチ」が提供されています。平たく言えば、シグナルにより、何らかのアクションが発生したときに、特定の送信者が一部の受信者に警告を発することができます。

Django はシグナリング メカニズムを提供します。実際、これはオブザーバー パターンであり、パブリッシュ/サブスクライブ (パブリッシュ/サブスクライブ) とも呼ばれます。何らかのアクションが発生するとシグナルが発行され、シグナルをリッスンする関数が実行されます。

Django には、次のようないくつかの組み込みシグナルがあります。


django.db.models.signals.pre_save 在某个Model保存之前调用
django.db.models.signals.post_save 在某个Model保存之后调用
django.db.models.signals.pre_delete 在某个Model删除之前调用
django.db.models.signals.post_delete 在某个Model删除之后调用
django.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送
ログイン後にコピー

私たちがしなければならないことは、受信機関数を登録することです。たとえば、各リクエストが完了した後に行を印刷したい場合です。

コールバック メソッドを使用して登録できます。


# receiver
def my_callback(sender, **kwargs):
  print("Request finished!")
 
# connect
from django.core.signalsimport request_finished
 
request_finished.connect(my_callback)
ログイン後にコピー

デコレータ メソッドを使用して登録することもできます。次のコードは上記と完全に同等です。


from django.core.signalsimport request_finished
from django.dispatchimport receiver
 
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")
ログイン後にコピー

receiverコールバック関数送信者に加えて、pre_save関数などの他のパラメータも使用できます:

sender: sender (pre_saveの場合、モデルクラス)
インスタンス: インスタンス
raw
using
update_fields
post_save() は、リンクされたいくつかの updates をサポートできる比較的実用的な関数です。毎回ビューに書き込ませる代わりに。例: ユーザーが返金申請を送信した場合、注文の ステータス を「返金済み」に変更する必要があります。シグナリング メカニズムは、どこでも変更することなく使用できます。


@receiver(post_save, sender=RefundForm)
deforder_state_update(sender, instance, created, **kwargs):
  instance.order.state = REFUNDING
  instance.order.save() # 这里,order是refundform的一个外键
ログイン後にコピー

もちろん、返金注文をキャンセルしてステータスを元に戻すなど、ここでより包括的に記述することもできます。

Observer は非常に実用的な 設計パターン であり、Django はユーザーが一部の信号をカスタマイズすることもサポートしています。

【関連推奨事項】

1. 特別な推奨事項: 「php Programmer Toolbox」V0.1 バージョンのダウンロード

2. Python の無料ビデオチュートリアル

3.

以上がDjangoのオブザーバーパターンの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート