ディレクトリ
Django 信号
Djangoは、私たちは、フレームの異なる位置の間で情報を渡す支援するシグナリングメカニズムが付属しています。すなわち、特定のイベントが発生した場合、であり、信号システムは、1つまたは複数の送信者(SENDERS)または受信者(レシーバ)のグループに送信される通知信号(信号)を可能にすることができます
システムに3つの要素がシグナリング:
- 信号<クラス:django.dispatch.Signal>例
- 信号送信側の送信者
- 受信機は、一つ以上の側面信号を受信します
信号分類:
- 信号例Djangoは、内蔵信号、内蔵のフレーム、フレームの送信側へのDjango
- カスタム信号、手動でインスタンスを作成するために、信号の開発者、および送信者と受信者を指定する必要
Djangoは内蔵の信号:
フレーム位置:フレームのsignals.pyファイル。例えば、各アプリケーションディレクトリの枠組み\のcontrib \ APP \のsignals.pyファイルとDjango \コア\のsignals.pyファイルに組み込まれジャンゴ。
# 在ORM模型的save()方法调用之前或之后发送信号:
django.db.models.signals.pre_save
django.db.models.signals.post_save
# 在ORM模型或查询集的delete()方法调用之前或之后发送信号:
django.db.models.signals.pre_delete
django.db.models.signals.post_delete
# 当多对多字段被修改时发送信号:
django.db.models.signals.m2m_changed
# 当接收和关闭HTTP请求时发送信号:
django.core.signals.request_started
django.core.signals.request_finished
# 规律 : 以 'pre' 开头的 代表动作之前的, 而以 'post' 开头 代表动作之后的
Djangoの特定の信号内容
定義された信号
すべての信号があるdjango.dispatch.Signal
の例
メソッドプロトタイプ:
def __init__(self, providing_args=None, use_caching=False):[source]
"""
providing_args: 信号提供 给接收者 的参数列表
use_caching :是否对于每个不同的发送者缓存发送者所拥有的接收者
"""
# 注意: 参数可都为空
信号を送信します
信号を伝送するためのDjangoの内の2つの方法があります。
Signal.send(sender, **kwargs)[source]
Signal.send_robust(sender,** kwargs)[source]
"""
注意: 1. 必须提供 sender 参数(大部分情况下是一个类名), 表明 发送方的身份
2. 可以提供任意数量的其他关键字参数
"""
要素上のグループのリストを返す[(受信応答)、...]、タプルビン受信と応答のリストを表す。)(送信()とsend_robust
たとえば、次のように機能の観点から定義することができます。
class Panda(View):
def get(self,request):
Signal.send(sender=self.__class__,) ##
return HttpResponse("shiwei is Good")
def post(self, request):
Signal.send_robust(sender=self.__class__) ##
return JsonResponse({
"code": 200,
'msg': "is Successful",
})
受信した信号
、指定された信号を受信するための信号()メソッドを接続Djangoのインスタンスを使用
メソッドプロトタイプ:
def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
"""
receiver : 当前信号连接的回调函数,也就是处理信号的函数。
sender : 指定从哪个发送方接收信号。
weak : 是否弱引用
dispatch_uid :信号接收器的唯一标识符,以防信号多次发送。
"""
注:受信された信号は、そのようなを表す信号を受信した場合、送信者が送信者パラメータ信号を指定することができます。
受信信号の第2の実施形態は、デコレータです。信号のコールバック処理に関する。このように、内部コール各信号インスタンスconnct()メソッドを受信します。
メソッドのプロトタイプ
def receiver(signal, **kwargs):
def _decorator(func):
if isinstance(signal, (list, tuple)): # 第一个 参数 可为信号实例的 元组 或 列表
for s in signal:
s.connect(func, **kwargs)
else:
signal.connect(func, **kwargs)
return func
return _decorator
信号受信機
いわゆる信号受信その操作のトリガ信号を受信した後、典型的には、機能、
def signal_callback(sender, **kwargs):
print("is my callback")
"""
注意:所有的接收器都必须接收一个sender参数和一个**kwargs通配符参数
"""
繰り返し信号の防止
重複した信号を防ぐために設定することができdispatch_uid
、次のように、あなたの受信機、通常の識別子の文字列を識別するためのパラメータを
from django.core.signals import request_finished
request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")
最終結果は、それぞれ独自のために、ということであるdispatch_uid
値、あなたの受信機は、第1の信号にのみ結合しています
Djangoは内蔵の信号手順
from django.core.signals import request_finished # 导入 信号
request_finished.connect(callback_func) # 接收 信号 , 并 指定 回调函数
カスタム信号手順
ファイルを作成します。
Djangoの定義された信号は、一般的にappディレクトリ内signals.pyファイルに保存されている、あなたは最初のアプリディレクトリsignals.pyでファイルを作成します
カスタム信号
signals.pyの定義における最初のステップ:
from django.dispatch import Signal
suosuo_signal = Signal()
カスタム信号受信機
それは一般ビューファイル、例えば、信号送信と同じ文章ファイルに配置され、任意の位置であってもよく、views.py
from django.dispatch import receiver
@receiver(signal=[suosuo_signal,], sender=SuoSuo) # signal 必须指定, sender 可选
def basket(sender, **kwargs): # 两个 参数必须 同样指定
print('Signal %s, callback func: basket '%sender.__name__)
print('SuoSuo 的 信号接收器')
カスタム信号は、文を送りました
例えば、views.py中
from django.views import View
from django.http import HttpResponse, JsonResponse
from suosuo.signals import suosuo_signal
class SuoSuo(View):
def get(self,request):
suosuo_signal.send(sender=self.__class__,)
return HttpResponse("SuoSuo is Good")
def post(self, request):
suosuo_signal.send_robust(sender=self.__class__)
return JsonResponse({
"code": 200,
'msg': "is Successful",
})