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的主要内容,如果未能解决你的问题,请参考以下文章