📜  如何在 Django 中创建和使用信号?(1)

📅  最后修改于: 2023-12-03 15:38:14.945000             🧑  作者: Mango

在Django中创建和使用信号

什么是信号?

信号是Django中的一种机制,用于在某些事件发生时,让一个或多个接收器处理信息。当在应用程序中发生特定的操作时,Django会发送一个信号。这个信号将被接收器捕获并执行相应的操作。

创建信号

要创建信号,使用Django内置的Signal类。Signal类实例会维护一个接收器列表,该列表将在信号发生时被调用。

from django.dispatch import Signal
    
my_signal = Signal()

信号的名称通常应该描述该事件的用途,例如,'user_logged_in'或'user_created'。

注册接收器

接收器是一个回调函数,当发送信号时,该函数将被调用。使用Signal.connect()方法将一个接收器函数连接到一个信号。

from django.dispatch import receiver

@receiver(my_signal)
def my_callback(sender, **kwargs):
    # Do something

接收器函数的第一个参数是信号的发送者,后续参数是关键字参数,这些参数是信号发送时传递的数据。

可以在任何地方注册接收器,通常情况下,最好在接收器的模块中注册。将接收器放在一个名为signals.py的模块中是一种良好实践。

发送信号

要发送信号,使用Signal.send()方法。将sender和任何要发送的数据作为参数传递。

my_signal.send(sender=self.__class__, arg1='value1', arg2='value2')

Signal.send()方法返回一个包含所有接收器返回值的ReceiverList对象。或者,可以使用Signal.send_robust()方法发送信号,该方法返回一个包含ReceiverTuple对象的元组。

results = my_signal.send_robust(sender=self.__class__, arg1='value1', arg2='value2')
for receiver, response in results:
    if response is None:
        # Receiver handled signal successfully
    else:
        # Receiver raised an exception

内置信号

Django内置了许多信号,使用信号可以改变Django内置行为或在特定事件发生时执行自定义操作。以下是一些内置的Django信号:

  • pre_save:在模型保存之前发送信号。
  • post_save:在模型保存后发送信号。
  • pre_delete:在模型删除之前发送信号。
  • post_delete:在模型删除后发送信号。
  • m2m_changed:在模型之间的ManyToMany字段发生改变时发送信号。

参考

Django官方文档中有更详细的说明和示例: https://docs.djangoproject.com/en/stable/topics/signals/