信号

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,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          # 创建数据库连接时,自动触发

信号和中间件的区别

  • 中间件:只在入口和出口

  • 信号:在内部有很多,几乎每个操作都有

使用方法

# 导入数据库
import pymysql
pymysql.install_as_MySQLdb()

# 导入内置信号
from django.db.backends.signals import xxoo
# 写执行内容
def callback(sender, **kwargs):
        print("xxoo_callback", sender, kwargs)
        print(sender,kwargs)
# 也可以执行多个函数 
def callback1(sender, **kwargs):
        print("xxoo_callback", sender, kwargs)
        print(sender,kwargs)

      
xxoo.connect(callback)
xxoo.connect(callback1)
  • 为了保证在程序运行的时候就执行信号,可以将信号写入init.py 文件里面
  • 所有信息都封装在sender以及kwargs里面
  • 如果需要添加或者删除某个功能的话,可以直接对函数进行操作,不用修改原来的代码

自定义信号

a. 定义信号

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

b. 注册信号

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

c. 触发信号

from 路径 import pizza_done

# 这句话写在哪说明在哪触发信号
pizza_done.send(sender='seven',toppings=123, size=456)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。简单来说,信号允许若干 ...
    与蟒唯舞阅读 1,341评论 0 1
  • Refer to: www.threemeal.com/blog/12/ 中间件 中间件是一个钩子框架,它们可以介...
    兰山小亭阅读 16,574评论 9 165
  • 这两幅画里的第一幅是因为画砸了, 把它剪下来,贴到另一张纸上接着画得。 衣服涂黑,是为了掩饰错误。 顺着第一幅,我...
    阿吨阅读 797评论 9 18
  • 爸爸终于搬到弟弟那里去住了。 搬到新家才知道,真是需要好多东西呀。走的时候只是先拿了一些必需品,准备其他的到时再买...
    金明啊阅读 192评论 0 0
  • 我讨厌比较,和自己好的人比较,会嫉妒,会羡慕,会失落。 更厌恶比较,和自己差的人比较,会拉低自己的层次,会打消自己...
    迷路的小象阅读 242评论 2 2