看懂python脚本_3分钟看懂Python后端必须知道的Django的信号机制

概念

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

(感觉就很像Qt的信号与槽机制)

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

发送者-信号的发出方

信号-信号本身

接收者-信号的接受者

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

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# django的modal执行其构造方法后,自动触发

pre_save# django的modal对象保存前,自动触发

post_save# django的modal对象保存后,自动触发

pre_delete# django的modal对象删除前,自动触发

post_delete# django的modal对象删除后,自动触发

m2m_changed# django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发

class_prepared# 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发

Management signals

pre_migrate# 执行migrate命令前,自动触发

post_migrate# 执行migrate命令后,自动触发

Request/response signals

request_started# 请求到来前,自动触发

request_finished# 请求结束后,自动触发

got_request_exception# 请求异常后,自动触发

Test signals

setting_changed# 使用test测试修改配置文件时,自动触发

template_rendered# 使用test测试渲染模板时,自动触发

Database Wrappers

connection_created# 创建数据库连接时,自动触发

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

1

2

django.db.models.signals.pre_save

django.db.models.signals.post_save

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

1

2

django.db.models.signals.pre_delete

django.db.models.signals.post_delete

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

1

django.db.models.signals.m2m_changed

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

1

2

django.core.signals.request_started

django.core.signals.request_finished

这就很方便了,想象一下这样一个情景,我们引入了一个第三方的Django库,他会创建模型,我们想要在不修改他的代码的情况下,在他创建模型的时候同时修改其他表的数据,那么这时候信号机制就能派上用场了。

简单使用例子

信号监听有两种方式,一种是 Signal.connect() 方法,一种是装饰器。

Signal.connect()方法

方法原型:

1

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

参数:

receiver :当前信号连接的回调函数,也就是处理信号的函数。

sender :指定从哪个发送方接收信号。

weak : 是否弱引用

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

装饰器法

1

2

3

4

5

6

from django.core.signalsimport request_finished

from django.dispatchimport receiver

@receiver(request_finished)

def my_callback(sender,**kwargs):

print("Request finished!")

可以给 receiver 添加 sender 参数来筛选接收哪个模型产生的信号,比如:

1

2

3

4

5

6

from django.db.modelsimport signals

from django.dispatchimport receiver

@receiver(signals.post_save, sender=MyModel)

def demo_callback(sender: MyModel, instance: MyModel,**kwargs):

pass

注意要读取传入的模型对象一定是要用 instance 参数,不是 sender ! sender 是一个类型!

设置dispatch_uid参数防止重复信号

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

1

2

3

from django.core.signalsimport request_finished

request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")

断开信号

在满足某些条件下,我们不再需要监听信号,可以选择断开信号。

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

1

Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)[source]

后记

最近刚入职项目很多特别的忙,也学到了很多新技术,但是感觉已经好久没有时间来好好写一篇博客了,就算是本文也是短时间拼凑的,真是难呀,周末得好好整理一下最近的技术笔记。

到此这篇关于3分钟看懂Python后端必须知道的Django的信号机制的文章就介绍到这了,更多相关Django 信号机制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/deali/p/13372922.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值