Djangoにおける信号のsignalsの簡単な使い方


本文
通常の開発過程では、いくつかの特殊なアプリケーションシーンに遭遇します。もし何かの操作を実行する前または後に通知を得ることができれば、Djangoの信号を使ってもいいです。Djangoは、フレームの他の場所で動作するときに、特定のイベントが発生したときに、この信号が登録されたすべてのコールバックを信号で通知し、所望の操作処理を行います。
一.Django内蔵信号
Djangoはデータテーブル、migrateコマンド、url要求に関連しています。testテストを使って、データベースの5種類の信号を接続します。

Model signals
 pre_init   # model       ,  
 post_init   # model       ,  
 pre_save   # model  save     ,  
 post_save   # model  save     ,  
 pre_delete   # model  delete     ,  
 post_delete   # model  delete     ,  
 m2m_changed   # model               ,  
 class_prepared  #      ,      model ,    ,  

Management signals
 pre_migrate   #   migrate ,  
 post_migrate   #   migrate ,  

Request/response signals
 request_started  #      ,  
 request_finished  #      ,  
 got_request_exception #      ,  

Test signals
 setting_changed  #   test        ,  
 template_rendered  #   test       ,  

Database Wrappers
 connection_created  #         ,  
1.常用内蔵信号パラメータの紹介
(1)django.db.models.signals.pre_保存する
presave処理プログラムのパラメータ紹介
パラメータ名パラメータの紹介
senderモデルクラス
instance保存の実際例(保存後のmodelデータオブジェクト)
rawブール値;Trueモデルが完全に提供された方式で保存されている場合。データベース内の他のレコードを検索/変更してはいけません。データベースはまだ一致していないかもしれません。
usingで使用されているデータベースのエイリアス
udate_fieldsは更新されたフィールドセットmodel.save()に転送します。またはNoneがudate_fieldsはそれに伝わっていません。save()
(2)django.db.models.signals.post_保存する
post_save処理プログラムのパラメータ紹介
パラメータ名パラメータの紹介
senderモデルクラス
instance保存の実際例
createdブール値Trueが新しいレコードを作成したら(Trueはデータ作成を表します)
rawブール値;Trueモデルが完全に提供された方式で保存されている場合。データベース内の他のレコードを検索/変更してはいけません。データベースはまだ一致していないかもしれません。
usingで使用されているデータベースのエイリアス
udate_fieldsは更新されたフィールドセットmodel.save()に転送します。またはNoneがudate_fieldsはそれに伝わっていません。save()
(3)django.db.models.signals.pre_delete
predelete処理プログラムのパラメータ紹介
パラメータ名パラメータの紹介
senderモデルクラス
instanceが削除する実際の例
usingで使用されているデータベースのエイリアス
(4)django.db.models.signals.post_delete
post_delete処理プログラムのパラメータ紹介
パラメータ名パラメータの紹介
senderモデルクラス
instanceが削除する実際のインスタンス(このオブジェクトはデータベースに存在しなくなりますので、この例に慎重に対応してください)
usingで使用されているデータベースのエイリアス
もっと多くの信号のパラメータを紹介します。参考にしてください。https://docs.djangoproject.com/zh-hans/2.1/ref/signals/
2.内蔵信号の傍受方法
Django内蔵の信号については、指定信号を登録するだけで、プログラムが実行されると登録関数が自動的にトリガされます。受信機(receiver function)を作成して信号を受信した後のフィードバック処理に使用すると、受信機を信号に接続する必要があります。二つの方法があります。手動接続とreceiver装飾器を使用する方法があります。
手動接続の実現方法:

from django.db.models.signals import post_delete

def my_callback(sender, **kwargs):
 print(sender)
 print("     ")

post_delete.connect(my_callback) #        ,         ,           ,    sender

# connect    
"""
receiver -             。     ,    
sender -               。
weak - Django               。  ,            ,        。        , weak=False     connect()     。
dispatch_uid -                         。
"""
receiver装飾器の実現方法:

from django.dispatch import receiver
from django.db.models.signals import post_delete
from app.models import UCenter

@receiver(post_delete, sender=UCenter) # post_delete        ,sender       
def delete_u2user(sender, instance, **kwargs): # instance        
 print(sender, instance)
もっと多くの信号操作に関する問題はドキュメントを参照してください。https://docs.djangoproject.com/zh-hans/2.1/topics/signals/
二.カスタム信号の使用
 1.定義信号

from django.dispatch import Signal

test_signal = Signal(providing_args=["name", "age"]) #     test_signal   ,      name age    (      )
2.登録信号

def my_callback(sender, **kwargs):
 print(sender)
 print("     ")

test_signal.connect(my_callback) #     ,      my_callback
3.トリガ信号

from xxx import test_signal

test_signal.send(sender='test', name='zzq', age='18') #     ,  name,age    
もちろんこのように送信信号を選択する方法には、Signal.sendを使用するものと、Signal.send_を使用するものがあります。robut
send()とsend_robust()受信機の機能を処理することによって生じる異常な方法が異なる。
send()は、受信機によって提案された任意の異常を捕捉することができない。それはエラー伝搬を許可するだけです。したがって、エラーに直面した場合、すべての受信機が信号を通知することができるわけではない。
send_robust()はPython Exception類から派生したすべてのエラーを捕獲し、すべての受信機が信号通知を受信することを保証する。エラーが発生した場合、エラーが発生した受信機のタプルペアにエラーのインスタンスが返される。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。