django自带一套信号机制来帮助我们在框架的不同位置之间传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个 发送者(senders)将 通知或信号(signals)发送给一组 接受者(receivers)。

信号系统包含一下三要素:

发送者——信号的发出放信号——信号本身接收者——信号的接受者

Django内置一整套信号,下面是比较常用的:

from django.db.models.signals import pre_save, post_save

post_save在ORM模型的save()方法调用之前或之后发送信号

from django.db.models.signals import pre_delete, post_delete

post_delete在ORM模型或查询集的delete()方法调用之前或之后发送信号。

from django.db.models.signals import m2m_changed

m2m_changed当多对多字段被修改时发送信号

from django.core.signals import request_started, request_finished

request_finished当接收和关闭HTTP请求时发送信号

监听信号

要接收信号,请使用Signal.connect()方法注册一个接收器。当信号发送后,会调用这个接收器 方法原型:

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

参数

recevier 当前信号连接的回调函数 也就是处理信号的函数

sender 指定从那个发送方接收信号

weak 是否弱应用

dispatch_uid 信号接收器的唯一标识符 以防信号多次发送

1.编写接收器 接收器其实就是一个python的函数或者方法

def my_callback(sender,**kwargs): print(“request finished”)

请注意,所有的接收器都必须接收一个sender参数和一个**kwargs通配符参数。

2.连接信号 其实就是监听信号。有两种方法可以连接信号,一种是下面的手动方式:

from django.core.signals import request_finished

request_finished.connect(my_callback)

另一种是使用receiver()装饰器:

from django.core.signals import request_finished from django.dispatch import receiver

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

3.接收特定发送者的信号 一个信号接收器,通常不需要接收所有的信号,只需要接收特定发送者发来的信号,所以需要在sender参数中,指定发送方。下面的例子,只接收MyModel模型的实例保存前的信号。

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): …

my_handler函数只在MyModel实例保存时被调用。

4.防止重复信号 为了防止重复信号,可以设置dispatch_uid参数来标识你的接收器,标识符通常是一个字符串,如下所示:

from django.core.signals import request_finished

request_finished.connect(my_callback, dispatch_uid=“my_unique_identifier”)

最后的结果是,对于每个唯一的dispatch_uid值,你的接收器都只绑定到信号一次。

自定义信号

除了Django为我们提供的内置信号(比如前面列举的那些),很多时候,我们需要自己定义信号。

所有的信号都是django.dispatch.Signal的实例。

import django.dispatch

pizza_done = django.dispatch.Signal()

发送信号

Django中有两种方法用于发送信号

Signal.send(sender, **kwargs)Signal.send_robust(sender, **kwargs)

必须提供sender参数(大部分情况下是一个类名),并且可以提供任意数量的其他关键字参数。 例如,这样来发送前面的pizza_done信号:

class PizzaStore(object): …

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)

Signal.disconnect()用来断开信号的接收器,和Signal.connect()中的参数相同。如果接收器成功断开,返回True,否则返回False。

信号实例

首先在根URLCONF中写一条路由:

from django.urls import path from django.contrib import admin from app1 import views

urlpatterns = [ path(‘admin/’, admin.site.urls), path(‘signal/’, views.create_signal), ]

这个很好理解,我在项目里创建了一个app1应用,在它的views.py中创建了一个create_signal视图,通过/signal/可以访问这个视图。这些都不重要,随便配置,只要能正常工作就行。

然后在views.py中自定义一个信号,以及创建create_signal视图:

from django.shortcuts import HttpResponse import time import django.dispatch from django.dispatch import receiver

定义一个信号

work_done = django.dispatch.Signal()

def create_signal(request): url_path = request.path print(“我已经做完了工作。现在我发送一个信号出去,给那些指定的接收器。”)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go) [外链图片转存中…(img-d0wWa7aY-1712866383898)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。