专栏首页菲宇Django的信号

Django的信号

Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。

通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。用于在框架执行操作时解耦。

1、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,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          # 创建数据库连接时,自动触发
Django 提供了一系列的内建信号,允许用户的代码获得DJango的特定操作的通知。这包含一些有用的通知:
django.db.models.signals.pre_save & django.db.models.signals.post_save

在模型 save()方法调用之前或之后发送。
django.db.models.signals.pre_delete & django.db.models.signals.post_delete

在模型delete()方法或查询集的delete() 方法调用之前或之后发送。
django.db.models.signals.m2m_changed

模型上的 ManyToManyField 修改时发送。
django.core.signals.request_started & django.core.signals.request_finished

Django建立或关闭HTTP 请求时发送。

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

方式1:

from django.core.signals import request_finished
    from django.core.signals import request_started
    from django.core.signals import got_request_exception

    from django.db.models.signals import class_prepared
    from django.db.models.signals import pre_init, post_init
    from django.db.models.signals import pre_save, post_save
    from django.db.models.signals import pre_delete, post_delete
    from django.db.models.signals import m2m_changed
    from django.db.models.signals import pre_migrate, post_migrate

    from django.test.signals import setting_changed
    from django.test.signals import template_rendered

    from django.db.backends.signals import connection_created


    def callback(sender, **kwargs):
        print("pre_save_callback")
        print(sender,kwargs)

    pre_save.connect(callback)      # 该脚本代码需要写到app或者项目的初始化文件中,当项目启动时执行注册代码

方式2:

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

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

2、自定义信号

a. 定义信号

1 2

import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

b. 注册信号

1 2 3 4 5

def callback(sender, **kwargs): print("callback") print(sender,kwargs) pizza_done.connect(callback)

c. 触发信号

1 2 3

from 路径 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)

由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。

练习:数据库添加一条记录时生成一个日志记录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django2.1集成xadmin管理后台所遇到的错误解决办法

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级...

    菲宇
  • Django中Celery的定时任务集群部署(三)

    Django中Celery的使用,本章主机要介绍celery定时任务部署多台主机,不同主机定时任务不同,统一通过django后台管理

    菲宇
  • Django xadmin图片上传与缩略图处理

    默认情况下,StdImageField 存储图像而不修改文件名。 如果您想使用更一致的文件名,可以使用内置的上传调用 比如:

    菲宇
  • Django源码学习-4-Signals 信号量

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(...

    小团子
  • 如何高效的学习 Linux

    幸好大学学过操作系统,顺利过关入职了。当时还纳闷,我做开发,掌握语言不就好了,为什么还要掌握操作系统。

    iMike
  • 深入理解 AMQP 协议

    原文链接:https://blog.csdn.net/weixin_37641832/article/details/...

    微风-- 轻许--
  • 【DB笔试面试667】在Oracle中,贵公司的数据库有多大?大一点的表有多大?有多少行?

    对于数据库的大小,需要注意的问题是数据库的大小不能以表空间的分配大小而论,而应该以表空间的占用空间大小而论,并且需要减掉SYSTEM、SYSAUX、TEMP和U...

    小麦苗DBA宝典
  • RabbitMQ 学习笔记1 - RabbitMQ简介和AMQP详解

    消息队列(Message Queue)提供一个异步通信机制,消息的发送者不必苦苦等待着消息被处理完成,转而继续自己的工作。消息中间件负责处理网络通信,如果网络连...

    zhangyunfeiVir
  • 算法一看就懂之「 插入排序 」

    今天咱们来看一看「 插入排序 」。「 插入排序 」与「 冒泡排序 」一样都属于时间复杂O(n*n)的排序算法,并且也都是基于元素之间比较的方式来完成排序的。不过...

    奎哥
  • PostgreSQL主从复制--逻辑复制

    逻辑复制是基于逻辑解析,其核心原理是逻辑主库将Publication中表的WAL日志解析成一定格式并发送给逻辑备库,逻辑备库Subscription接收到解析后...

    July

扫码关注云+社区

领取腾讯云代金券