• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

3分钟看懂Python后端必须知道的Django的信号机制

python 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论

概念

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

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

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

  • 发送者-信号的发出方
  • 信号-信号本身
  • 接收者-信号的接受者

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

Django内置信号

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,rem<div style="color:transparent">本文来源gaodai.ma#com搞#代!码(网</div>ove,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()方法调用之前或之后发送信号

django.db.models.signals.pre_save
django.db.models.signals.post_save

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

django.db.models.signals.pre_delete
django.db.models.signals.post_delete

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

django.db.models.signals.m2m_changed

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

django.core.signals.request_started
django.core.signals.request_finished

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

简单使用例子
信号监听有两种方式,一种是 Signal.connect() 方法,一种是装饰器。

Signal.connect()方法

方法原型:

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

参数:

  • receiver :当前信号连接的回调函数,也就是处理信号的函数。
  • sender :指定从哪个发送方接收信号。
  • weak : 是否弱引用
  • dispatch_uid :信号接收器的唯一标识符,以防信号多次发送。

装饰器法

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:3分钟看懂Python后端必须知道的Django的信号机制

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址