Django—信号 signal_django signal例子,精心整理

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

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

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

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

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()

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

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

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-e2NKQQaA-1713297794232)]

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

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值