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内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. ...
随机推荐
- UDP发送文件
接收端 package com.zy.demo2; import java.io.File; import java.io.FileOutputStream; import java.net.Data ...
- 折半搜索(meet in the middle)
折半搜索(meet in the middle) 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 这个 ...
- poj3757 Training little cats
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11496 Accepted: 2815 Description Face ...
- Bone Collector II HDU - 2639 01背包第k最大值
题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...
- Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)
题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...
- boomworks 1999~2009
大众软件 PC定时执行专家 4.0 (PCTaskTimer) - 功能强大.简单易用的定时执行软件.具有功能多.体积小.消耗资源少的特点. 超级网际搜索(SuperSearch) - 免费.快速.高 ...
- anaconda python3.7 安装 tensorflow-gpu 2.0.0 beta1 配置PyCharm
参考tensorflow 公众号<tensorflow2.0 安装指南> https://mp.weixin.qq.com/s/7rNXFEC5HYe91RJ0-9CKdQ # 1. NV ...
- sql-libs(5)
直接只用floor报错注入 或者 update即可
- export html to canvas image
export html to canvas image canvas.toDataURL https://developer.mozilla.org/en-US/docs/Web/API/HTMLCa ...
- free open movie API all in one
free open movie API all in one movie API TMDb API The Movie Database https://www.themoviedb.org/docu ...