Django 笔记之 Signals 信号
Django包含一个“信号调度程序”(signal dispatcher
),它有助于在框架中的其他位置发生事件时通知其他的应用程序。 简而言之,信号允许某些发送者通知一组接收器已经发生了某些动作。当许多代码片段可能对相同的事件感兴趣时,它们特别有用。
内置信号
1.django.db.models.signals.pre_save
& django.db.models.signals.post_save
模型保存前后
2.django.db.models.signals.pre_delete
&django.db.models.signals.post_delete
模型删除前后
3.django.db.models.signals.m2m_changed
ManyToManyField 改动时
4.django.core.signals.request_started
&django.core.signals.request_finished
请求开始和结束时
监听信号
接收器函数
接收器 可以是 python 函数或方法
参数必须是 sender,**kwargs 是必须的
def my_callback(sender,**kwargs):
print("Request finished!")
连接接收器函数
signal 对象连接接收器
from django.core.signals import request_finished
request_finished.connect(my_callback)
这些代码可以在任何位置,不推荐在app根目录和models模块
常常在 app signals 子模块
连接到特定发件人发送的信号
好比你只想接收某人的消息,指定一个 sender 参数就行
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
...
防止重复信号
指定 dispatch_uid
from django.core.signals import request_finished
request_finished.connect(my_callback,dispatch_uid="my_unique_identifier")
定义和发送信号
定义信号
所有的信号都是 django.dispatch.Signal 的实例。
providing_args 是参数名列表
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
发送信号
两种方法:
包含 sender 和 kwargs 参数
不用管 接收器的异常
Signal.send(sender, **kwargs)
捕获所有接收器的异常
Signal.send_robust(sender, **kwargs)
class PizzaStore:
def send_pizza(self, toppings, size):
pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
断开信号
Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)