一、引子

  在操作数据的时候,假设我们需要记录一些日志,这个时候,我们需要用什么来显示这个需求呢?装饰器?装饰器只能先实现整体的操作。在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 migrate

  3.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 内置“信号”机制和自定义方法的更多相关文章

  1. Django内置信号

    阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...

  2. Django缓存和内置信号

    缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...

  3. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  4. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  5. Django 内置分页器

    先导入Django内置的分页器 在商品列表页或者购物车列表页导入 在渲染list.html导入 然后在views后台渲染方法写入 打开list页面结果

  6. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  7. Django内置模版过滤器

    Django内置过滤器总览 可以查询下表来总览Django的内置过滤器: 过滤器 说明 add 加法 addslashes 添加斜杠 capfirst 首字母大写 center 文本居中 cut 切除 ...

  8. Django内置模板标签

    Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...

  9. Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档

    前言 基本环境 Django版本:1.11.8 Python版本:3.6 OS: win10 x64 本文摘要 提供了常用的Django内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. ...

随机推荐

  1. getline()的使用注意

    在使用getline读入一整行时,若是前面是使用getchar().cin这类读入了一个字母,但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题. 这是因为输入数字之后 ...

  2. Codeforces Round #622 (Div. 2) A. Fast Food Restaurant(全排列,DFS)

    Codeforces Round #622 (Div. 2) A. Fast Food Restaurant 题意: 你是餐馆老板,虽然只会做三道菜,上菜时还有个怪癖:一位客人至少上一道菜,且一种菜最 ...

  3. 【noi 2.6_4982】踩方格(DP)

    题意:一个无限大的方格矩阵,能向北.东.西三个方向走.问走N步共有多少种不同的方案. 解法: f[i]表示走 i 格的方案数. 状态转移方程推导如下--设l[i],r[i],u[i]分别为第 i 步向 ...

  4. poj2443Set Operation (bitset)

    Description You are given N sets, the i-th set (represent by S(i)) have C(i) element (Here "set ...

  5. fiddler抓包+安卓机 完成手机app抓包的配置 遇到的一些问题

    fiddler抓包+安卓模拟器完成手机app抓包的配置:fiddler抓包+雷电模拟器 完成手机app抓包的配置 其实在安卓真机上弄比在虚拟机上弄更麻烦一点,它们的步骤都差不多一样,就是在安卓真机上弄 ...

  6. 2020 年百度之星·程序设计大赛 - 初赛一Dec 简单dp

    题意: Problem Description 初始有 a, ba,b 两个正整数,每次可以从中选一个大于 1 的数减 1,最后两个都会减到 1,我们想知道在过程中两个数互质的次数最多是多少. Inp ...

  7. Java 窗口 小马时钟

    写在前面: eclipse爽到 好多都是抄的,记不住原网址了 摸爆了 搞了一个无边框JFrame,给JFrame加入鼠标监听器实现了拖动 搞了按钮,可以关闭.最小化.始终显示在前.静音 icon是抄( ...

  8. 洛谷-P1469 找筷子 (位运算)

    题意:给你一组数,求数组中唯一的出现次数为奇数的那个数. 题解:这题其实直接桶排一下就行了,但是最后一个点会TLE. ​ 后来了解到这题可以用位运算来解决: ​ ^(异或)运算符:用于比较两个二进制数 ...

  9. linux搭建网站

    CentOS 1.安装 yum -y install nginx *或者安装指定版本,版本网址:http://nginx.org/packages/centos/7/x86_64/RPMS/ rpm ...

  10. 洛谷P2241-统计方形-矩形内计算长方形和正方形的数量

    洛谷P2241-统计方形 题目描述: 有一个 \(n \times m\) 方格的棋盘,求其方格包含多少正方形.长方形(不包含正方形). 思路: 所有方形的个数=正方形的个数+长方形的个数.对于任意一 ...