Django之信号

简介:

一、什么是信号

    Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。


二、Django内置信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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       # 创建数据库连接时,自动触发

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ( "------pre_save_callback-------" )
     print (sender, kwargs)
 
# 注册信号
pre_save.connect(callback)

    上面的例子中,我自定义了一个callback函数,并将这个函数注册到了pre_save这个信号中,每当Django中model对象执行保存前,就会执行callback函数,callback函数中的内容自己定义。函数中有两个参数sender和**kwargs,sender是信号的触发者,**kwargs接收的是键值对形式的参数。

    必须将信号在Django启动时注册到Django中,否则Django无法触发。方法一:将上面的内容写入到项目的__init__.py文件中,__init__.py文件在项目启动时一定会执行的。方法二:新建一个py文件,将以上内容写入其中,将这个模块导入到__init__.py文件中,模块在第一次导入的时候会执行一遍模块内容。


三、自定义信号

a、定义和注册自定义的信号

1
2
3
4
5
6
7
8
9
10
11
12
import  django.dispatch
 
# 自定义一个pizza_done的信号
pizza_done  =  django.dispatch.Signal(providing_args = [ "toppings" "size" ])
 
# 信号触发时执行的函数
def  callback(sender,  * * kwargs):
     print ( "callback" )
     print (sender,kwargs)
  
# 注册信号
pizza_done.connect(callback)

b、触发信号

自定义信号不是Django内置的信号,Django不知道何时触发它。我们必须自己手动触发它。

1
2
3
from  xxx  import  pizza_done
  
pizza_done.send(sender = 'aaa' ,toppings = 1 , size = 2 )

    在views中通过自定义信号名.send就可以手动触发自定义信号,sender写触发者,toppings和size是参数,如果没有特殊安排,参数随意写就好。而且这几个参数都是必须的哦!其核心思想就是执行信号所注册的函数。

本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1978232如需转载请自行联系原作者


daibaiyang119

相关文章
|
7月前
|
开发者 Python
Django的信号机制:实现应用间的通信与响应
【4月更文挑战第15天】Django信号机制实现跨组件通信,基于订阅/发布模式,允许在事件(如模型保存、删除)发生时触发自定义函数。内置信号如`pre_save`、`post_save`,也可自定义信号。使用包括定义信号、连接处理器和触发信号。常用于模型操作监听、第三方应用集成和跨应用通信。注意避免滥用和保证处理器健壮性。信号机制提升代码可维护性和扩展性。
|
调度 数据库 开发者
django -- 信号
django -- 信号
|
设计模式 Python
Django的信号机制详解
Django的信号机制详解
|
缓存 中间件 数据库
第25天,Django之缓存、序列化、信号
目录 一、缓存 1. 配置 1.1 开发调试 1.2 内存 1.3 文件 1.4 数据库 1.
1021 0
|
数据库 Python 调度
Django中的信号及其用法
Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signals pre_init # Django中的model对象执行其构造方法前,...
795 0
|
缓存 中间件 数据库
Django进阶之缓存和信号
一、缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
1225 0
|
Python
django 1.8 官方文档翻译:14-5 信号
信号 Django包含一个“信号的分发器”,允许解耦的应用在信号出现在框架的任何地方时,都能获得通知。简单来说,信号允许指定的 发送器通知一系列的接收器,一些操作已经发生了。
960 0
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
182 45
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
66 2