Django 笔记之 Signals 信号

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值