django 内置“信号”机制和自定义方法
一、引子
在操作数据的时候,假设我们需要记录一些日志,这个时候,我们需要用什么来显示这个需求呢?装饰器?装饰器只能先实现整体的操作。在django 里面有这么一个东西--信号 下面我们就来了解了解它。
操作对象前后,django都会预留两个钩子,它是用signals.post_save.send,表示触发一个信号。所以比如说我们在操作数据库的时候,要在插入数据之前写入日志,插入完成之后也写入日志,那这个就会用到我们今天的django信号。Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
二、django的内置信号

1 Model signals
2 pre_init # django的modal执行其构造方法前,自动触发
3 post_init # django的modal执行其构造方法后,自动触发
4 pre_save # django的modal对象保存前,自动触发
5 post_save # django的modal对象保存后,自动触发
6 pre_delete # django的modal对象删除前,自动触发
7 post_delete # django的modal对象删除后,自动触发
8 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
9 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
10 Management signals
11 pre_migrate # 执行migrate命令前,自动触发
12 post_migrate # 执行migrate命令后,自动触发
13 Request/response signals
14 request_started # 请求到来前,自动触发
15 request_finished # 请求结束后,自动触发
16 got_request_exception # 请求异常后,自动触发
17 Test signals
18 setting_changed # 使用test测试修改配置文件时,自动触发
19 template_rendered # 使用test测试渲染模板时,自动触发
20 Database Wrappers
21 connection_created # 创建数据库连接时,自动触发

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

1 import win_unicode_console
2 win_unicode_console.enable()#这个在windows里面用的,这个需要用之前先安装一下
3 from django.core.signals import request_finished
4 from django.core.signals import request_started
5 from django.core.signals import got_request_exception
6
7 from django.db.models.signals import class_prepared
8 from django.db.models.signals import pre_init, post_init
9 from django.db.models.signals import pre_save, post_save
10 from django.db.models.signals import pre_delete, post_delete
11 from django.db.models.signals import m2m_changed
12 from django.db.models.signals import pre_migrate, post_migrate
13
14 from django.test.signals import setting_changed
15 from django.test.signals import template_rendered
16
17 from django.db.backends.signals import connection_created
18
19 #这个函数你想写什么写什么,这边的注册函数可以写多个
20 def callback(sender, **kwargs):
21 print("xxoo_callback")
22 print(sender,kwargs)
23
24 xxoo.connect(callback) #注册函数
25 # xxoo指上述导入的内容,比如pre_init.connect(callback)

注意了:当程序执行操作时,会自动触发注册函数,但是,不是随便放的,需要放在 project下的__init__.py文件中,这样的话,项目启动,文件内容就会自动加载到内存中,这样我们就可以方便使用了:

三、搞一搞,测试一把
3.1 models 创建数据库
|
1
2
|
class User(models.Model): user=models.CharField(max_length=32)<br><br>执行:<code class="python plain hljs">python manage.py makemigrations</code> |
python manage.py migrate3.2,views

1 from app01 import models
2 def signal(request):
3 obj=models.User(user="root")
4
5 print("end")
6 obj.save()
7
8 obj1=models.User(user="root1")
9 obj1.save()
10 return HttpResponse("TEST SIGNAL")

urls
path("signal/",views.signal),
访问

输入:

所以我们看出来了,我们调用了数据库操作的信号,所以在所有的modles操作之前都有这个操作,这个只是插入数据库之前的操作,如果想要看更多操作,请看上面的操作。
3.3、django信号创建流程

四、自定义信号
4.1、创建信号
说明:pizza_done是信号名,providing_args=["toppings", "size"],这个是触发者的时候需要传递的参数
1 import django.dispath
2
3 pizza_done=django.dispath.Signal(providing_args=["toppings","size"])
4.2、注册信号
1 def callback(sender, **kwargs): #创建注册信号的函数,这边的注册函数可以写多个
2 print("callback")
3 print(sender,kwargs)
4
5 pizza_done.connect(callback) #注册信号
4.3、触发信号
|
1
2
3
|
from 路径 import pizza_done pizza_done.send(sender='zhangqigao',toppings=123, size=456) |
下面搞栗子


所以我们自定义信号的时候,我们自己触发就行了。那我们在什么情况下使用呢 ?
答:你某个阀值,你去监控服务器,当到达某个状态的时候,就可以让他执行某个操作,等着你的要求,源码不要动,只需要注册信号就可以了。
由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。
更多:猛击这里
django 内置“信号”机制和自定义方法的更多相关文章
- Django内置信号
阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...
- Django缓存和内置信号
缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...
- Django内置Admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...
- Django内置分页
一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...
- Django 内置分页器
先导入Django内置的分页器 在商品列表页或者购物车列表页导入 在渲染list.html导入 然后在views后台渲染方法写入 打开list页面结果
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
- Django内置模版过滤器
Django内置过滤器总览 可以查询下表来总览Django的内置过滤器: 过滤器 说明 add 加法 addslashes 添加斜杠 capfirst 首字母大写 center 文本居中 cut 切除 ...
- Django内置模板标签
Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...
- Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档
前言 基本环境 Django版本:1.11.8 Python版本:3.6 OS: win10 x64 本文摘要 提供了常用的Django内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. ...
随机推荐
- uva10859 Placing Lampposts (树形dp+求两者最小值方法)
题目链接:点击打开链接 题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边.在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大. ...
- hdu5247 找连续数
Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这 ...
- Codeforces Round #550 (Div. 3) D. Equalize Them All (贪心,模拟)
题意:有一组数,可以选择某个数\(a_i\)相邻的一个数\(a_j\),然后可以让\(a_i\)加上或者减去\(|a_i-a_j|\),问最少操作多少次使得数组中所有数相同. 题解:不难发现,每次操作 ...
- SPI/QSPI通信协议详解和应用
SPi是高速全双工的串行总线,通常应用在通讯速率较高的场合. SS:从设备选择信号线,也称片选信号线 每个从设备都有一个独立的SS信号线,信号线独占主机的一个引脚,及有多少个从设备就有多少个片选信号线 ...
- 并发编程之java内存模型(Java Memory Model ,JMM)
一.图例 0.两个概念 Heap(堆):运行时的数据区,由垃圾回收负责,运行时分配内存(所以慢),对象存放在堆上 如果两个线程,同时调用同一个变量,怎两个线程都拥有,该对象的私有拷贝 (可以看一下,T ...
- Redis 的缓存淘汰机制(Eviction)
本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...
- hdu-6237
A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- 2019牛客多校第一场I Points Division(DP)题解
题意: n个点,分成两组A,B,如果点i在A中,那么贡献值\(a_i\),反之为\(b_i\). 现要求任意\(i \in A,j \in B\)不存在 \(x_i >= x_j\) 且 \(y ...
- windows信息收集
导语:介绍 特权升级总是被归结为适当的枚举.但要完成适当的枚举,你需要知道要检查和查找的内容.这通常需要伴随着经验的丰富而对系统非常熟悉.起初特权升级看起来像是一项艰巨的任务,但过了一段时间,你就 ...
- Linux 驱动框架---驱动中的异步
异步IO是对阻塞和轮询IO的机制补充,所谓异步IO就是在设备数据就绪时主动通知所属进程进行处理的机制.之所以说是异步是相对与被通知进程的,因为进程不知道也无法知道什么时候会被通知:这一机制非常类似于硬 ...