Django 信号 Signals

Posted 亦非我所愿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 信号 Signals相关的知识,希望对你有一定的参考价值。

文章目录

一、什么是信号

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

你也可以理解为是一个hooks,当触发某一种类型的操作之后,会进行一些hooks操作

官方描述:Django包含一个“信号调度程序”,它有助于在框架中的其他位置发生操作时通知分离的应用程序。简而言之,信号允许某些发送者通知一组接收器已经发生了某些动作。当许多代码可能对同一事件感兴趣时,它们特别有用。

官方内置信号文档:https://docs.djangoproject.com/zh-hans/2.1/ref/signals/


二、内置信号类型

1、Model sginals
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中的model类,对于每一个类,自动触发

2、Management signals
Management signals
    pre_mgirate              # 执行migrate命令前,自动触发
    post_migrate             # 执行migrate命令后,自动触发

3、Request/Response signals
Request/Response signals
    request_started          # 请求到来前,自动触发
    request_finished         # 请求结束后,自动触发
    got_request_exception    # 请求异常后,自动触发

4、Test signals
Test signals
    setting_changed          # 使用test测试修改配置文件时,自动触发
    template_rendered        # 使用test测试渲染模版时,自动触发

5、Database signals
Database Wrappers
    connection_created       # 创建数据库连接时,自动触发

三、使用内置信号

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

示例:在我的主机列表中,当通过views中的orm操作新增一条主机信息的时候,我会通过信号打印出新增的这条信息

新建Host和Group models

from django.db import models

# Create your models here.

class Group(models.Model):
    name = models.CharField(max_length=32)

class Host(models.Model):
    name = models.CharField(max_length=32)
    host = models.CharField(max_length=32)
    port = models.CharField(max_length=32)
    group = models.ForeignKey(to="Group", to_field="id", on_delete="CASCADE")

编写views规则,为了方便, 我这边的主机信息已经写在orm操作里面

def signals(request):
    if request.method == 'GET':
        models.Host.objects.create(name='host1', host='1.1.1.1', port=22, group_id='1')
    return HttpResponse('ok')

注册信号,在项目跟路径下面创建signals.py文件,并且写好我要调用的函数名称

from django.db.models.signals import post_save

def signals_post_save(sender, instance, **kwargs):
    print('"status": "add", "id": "%s", "host": %s, "port": %s, "group": %s' % (instance.id, instance.host, instance.port, instance.group_id))
    
post_save.connect(signals_post_save)

引入信号,在项目下的__init__.py文件中, 引入signals.py文件;表示在项目运行的时候,已经注册好了信号,在post_save操作的时候,信号即可执行

import pymysql
pymysql.install_as_MySQLdb()

import signals

开始访问我的页面,并且得到返回的ok

查看数据库,数据已经插入成功

查看程序输出,已经print出信号post_save调用函数singals_post_save中定义的内容


四、自定义信号

以上是关于Django 信号 Signals的主要内容,如果未能解决你的问题,请参考以下文章

Django中的信号

Django中的信号

django信号 signal

信号 signal

Django 信号signal

Celery Signals与Django Signals