[TimLinux] Django 信号

1. 信号定义

django包含有一个“信号分发器”,在框架内任何时候,在任何地方,有动作方式是,用来帮助解耦应用之间获取通知。简言之,信号允许特定的发送者通知一系列接收者动作已经发生了。特别有用的地方在于:许多代码片段对于同样的事件感兴趣。

2. 内建信号

django提供了许多内建的信号,这样用户代码能够在django自身的一些特定动作发生时得到通知。如下:

  • django.db.models.singals.pre_save、django.db.models.signals.post_save:在模型的save()方法被调用之前、之后发送该信号。
  • django.db.models.signals.pre_delete、django.db.models.signals.post_delete:在模型的delete()方法被调用之前、之后发送该信号。
  • django.db.models.signals.m2m_chagned:当一个ManyToManyField模型发送修改是发送该信号。
  • django.core.signals.request_started、django.core.signals.request_finished:在django开始、完成一个HTTP请求时发送该信息。
  • 等等其他信号。

3. 监听信号

为了接收一个信号,使用Signal.connect()方法来注册一个信号接收函数,当信号被发送的时候接收函数将被调用。函数接口如下:

Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)

参数说明:
receiver: 回调函数,将被连接到对象的信号上。receiver函数有它的实现要求
sender: 指定一个特定的发送者,明确信号从哪里来的。
weak: django存储信号处理器默认作为弱引用。可以通过设置weak=False来修改这一行为。
dispatch_uid: 信号接收者的唯一标识,以免重复信号被发送。

例如:request_finished就是一个Signal对象,下面这行代码完成了信号的监听request_finished.connect(my_callback)

下面的函数定义,完成了接收函数的定义def my_callback(sender, **kwargs):    print("Request finished!")

3.1. 接收函数

接收函数可以是任意Python函数或方法:接收一个sender位置参数,一个通配的kwargs关键字参数,所有信号处理器必须接收这些参数。所有的信号发生kwargs参数,并且可能在任一时间改变这些关键字参数。根据request_finished信号文档说明,它不会发送任何参数,看似上面的回调函数也可能不传递关键字参数,但是这样的操作是错误的,如果你真的这样做,django会抛出一个错误的。

3.2. 连接接收函数

两种方式可以将一个接收者连接到信号上去。

# 1. 手动连接
from django.core.signals import request_finished

def my_callback(sender, **kwargs):
    print("Request finished!")
request_finished.connect(my_callback)

# 2. 使用 receiver 装饰器连接
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

现在my_callback函数会在每次完成完成一次请求之后被调用。

3.3. 连接信号:指定发送者

指定发送者的目的是缩小事件的监听范围,比如pre_save()信号,多数情况下只是想知道某一个特定的模型上发生的这一信号,而不是所有的模型。这时候就可以指定你所关心的sender,比如sender=User,那么只有当User模型在pre_save信号发送时,才调用receiver函数。不同的信号,能够接收的sender参数是值不同,需要根据信号文档描述进行设置,不能乱猜哦!

from django.core.signals import pre_save
from django.dispatch import receiver
from myapp.models import User

@receiver(pre_save, sender=User)
def my_handler(sender, **kwargs):
    print("pre_save happen in User.")

3.4. 阻止重复信号

原文地址:https://www.cnblogs.com/timlinux/p/9255427.html

时间: 2024-09-30 16:15:31

[TimLinux] Django 信号的相关文章

自动化运维Python系列之Django信号、缓存操作

Django信号 Django内部提供了一种"信号强度"处理机制,简单理解就是当Django在接收到请求后内部做某些特定操作前发出信号,提醒一些接受者或者做操作,这样的好处就是方便程序定制小功能插件,也是对本身框架的一种节藕操作 1)Django的内置信号 Model signals     pre_init                # django的modal执行其构造方法前,自动触发     post_init               # django的modal执行其构

Django信号

Django信号 Django提供一个"信号分发器",永许解耦的应用在框架的其它地方发生操作时会被通知到 也就是说在特定事件发生时, 可以发送一个信号去通知注册这个信号的一个或者多个回调,在回调里进行逻辑处理 如何监听信号 - 拥有一个Signal实例 - 信号回调 - 将信号回调绑定到Signal实例 - 在特定事件中Signal发送信号 Django内置信号 - django.db.model.signals.pre_save & post_save 在模型 seve()

信号(Django信号、Flask信号、Scrapy信号)

简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 下面,分别介绍一下三种信号的使用示例. Django信号 很多数情况下,我们需要在操作数据库之前或者之后做某些操作,比如说写个日志之类的,我们当然可以找到每一个sql语句,在其前后加一段代码, 但是,这不但浪费时间,

django 信号 目录 1.11

django 信号介绍 1.11 django 自定义信号 1.11 原文地址:https://www.cnblogs.com/mingerlcm/p/10242073.html

flask,scrapy,django信号

简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 下面,分别介绍一下三种信号的使用示例. Django信号 很多数情况下,我们需要在操作数据库之前或者之后做某些操作,比如说写个日志之类的,我们当然可以找到每一个sql语句,在其前后加一段代码, 但是,这不但浪费时间,

Django 信号

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 相当于我们创建了一个hook. 1. Django的内置信号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Model signals     pre_init                    # django的modal执行其构造方法前,自动触发     post_init      

23:django 信号(signal)

django包含了一个“信号分配器”使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 为此,django提供了很多内置的信号,比如一些常用的功能(以几个在django.db.models.signal目录下的信号为例): save:pre_save和post_save delete:pre_delete和post_delete chang

django信号相关

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_del

django信号调度的用法

Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signals pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Django中的model对象保存前,自动触发 post_save # Django中的model对象保存后,自动触发 p