十六 Django框架,信号
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
也就是当程序有指定动作时,触发一个信号函数
1、Django内置信号

- 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中modal类,对于每一个类,自动触发
- Management signals #执行命令时
- pre_migrate # 执行migrate命令前,自动触发
- post_migrate # 执行migrate命令后,自动触发
- Request/response signals
- request_started # 请求到来前,自动触发
- request_finished # 请求结束后,自动触发
- got_request_exception # 请求异常后,自动触发
- Test signals
- setting_changed # 使用test测试修改配置文件时,自动触发
- template_rendered # 使用test测试渲染模板时,自动触发
- Database Wrappers
- connection_created # 创建数据库连接时,自动触发

信号的使用
首先在app项目的__init__.py 这个文件,设置信号行为,因为这个文件是所有操作都会经过的
1、在__init__.py导入信号模块
2、自定义信号执行函数
3、将信号执行函数注册到信号
注意:
1、自定义信号执行函数,有两个固定参数sender, **kwargs
sender:返回触发信号执行函数的,对象或方法
kwargs:触发信号执行函数的,对象或方法传过来的数据
connect()注册信号执行函数到信号里
使用方式:
信号名称.connect(自定义信号执行函数名称)

- from django.core.signals import request_finished
- from django.core.signals import request_started #有请求是触发信息
- from django.core.signals import got_request_exception
- from django.db.models.signals import class_prepared
- from django.db.models.signals import pre_init, post_init
- from django.db.models.signals import pre_save, post_save
- from django.db.models.signals import pre_delete, post_delete
- from django.db.models.signals import m2m_changed
- from django.db.models.signals import pre_migrate, post_migrate
- from django.test.signals import setting_changed
- from django.test.signals import template_rendered
- from django.db.backends.signals import connection_created
- def callback(sender, **kwargs): #自定义信号函数
- print("执行信号函数")
- # print(sender) #打印触发信号的对象或方法
- # print(kwargs) #触发者传过来的数据
- request_started.connect(callback) #将自定义信号函数注册到信号

2、自定义信号
自定义信号需要我们手动触发
a. 定义信号模块
- import django.dispatch
- pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) #定义一个信号,触发时必须传两个参数
b. 注册信号
- def callback(sender, **kwargs):
- print("callback")
- print(sender,kwargs)
- pizza_done.connect(callback)
c. 触发信号
- from 路径 import pizza_done
- pizza_done.send(sender='seven',toppings=123, size=456)
十六 Django框架,信号的更多相关文章
- Python学习(三十)—— Django框架简介
转载自:http://www.cnblogs.com/liwenzhou/p/8296964.html Django框架简介 一.MVC框架和MTV框架(了解即可) MVC,全名是Model View ...
- Django框架---- 信号
Django中的信号及其用法 Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的sign ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- 六 Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多
链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.ForeignKey()外键字段一对多,值是要外键的表类 from __future__ import unico ...
- selenium-webdriver(python) (十六) --unittest 框架
学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试(一)----selen ...
- 十九 Django框架,发送邮件
全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS ...
- 十八 Django框架,生成二维码
用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qrcode img = qrcode.make ...
- 十五 Django框架,缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- 十四 Django框架,中间件
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的se ...
随机推荐
- openwrt修改密码
默认情况下root是没有密码的 需要设置密码后才能开启ssh 修改/etc/shadow文件: root:$1$wEehtjxj$YBu4quNfVUjzfv8p/PBo5.:0:0:99999:7: ...
- Redis源码阅读-sds字符串源码阅读
redis使用sds代替char *字符串, 其定义如下: typedef char *sds; struct sdshdr { unsigned int len; unsigned int free ...
- 华为nova3发布,将支持华为AI旅行助手
华为nova3于7月18日18:00在深圳大运中心体育馆举行华为nova 3的发布会,从本次华为nova3选择的代言人-易烊千玺,不难看出新机依然延续nova系列的年轻属性,主打 “高颜值 爱自 ...
- Highways - poj 2485 (Prim 算法)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24383 Accepted: 11243 Description T ...
- YUM安装(卸载)KDE和GNOME
YUM安装(卸载)KDE和GNOME显示系统已经安装的组件,和可以安装的组件:#yum grouplist 如果系统安装之初采用最小化安装,没有安装xwindow,那么先安装:#yum groupin ...
- 我为什么要学习jquery
因为jquery很强大,很少的代码实现更多的功能.
- jquery基础研究学习【基础】
2017年6月6日15:07:58 该看:http://www.runoob.com/jquery/jquery-fade.html 淡入淡出 jQuery 教程 ...
- iptables基础及samba配置举例
iptable基本概念 iptables防火墙包含两部分,即位于用户空间的iptables模块和位于内核空间netfilter模块.用户空间模块提供插入.修改和除去包过滤表中规则,内核模块进行实际的过 ...
- LR报错 No buffer space available Try changing the registry value 端口号不够用了
报错:Action.c(6): Error -27796: Failed to connect to server "10.16.137.8:10035": [10055] No ...
- effect request
from bs4 import BeautifulSoup import os filepath = 'D:\\pymine\\clean\\spider_map\\baidu_map_html_fi ...