什么是信号?

  信号是在某个操作前或后自动触发一些操作. 信号是通知,是一种状态,相当于在某种状态下发特定的消息

  --为了实现代码层解耦

  村长博客:http://www.cnblogs.com/leguan1314/articles/6555581.html

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 ↓↓

  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          # 创建数据库连接时,自动触发  

示例:

实现创建记录成功后print创建成功 -- 用post_save内置信号,django的modal对象保存后,自动触发post_save

首先注册信号: 固定写法

代码逻辑:

执行结果:

其他应用场景:

  用户注册成功后发送邮件/  订单支付成功后给管理员发消息/ 文章从未发布变成发布就让文章置顶

自定义信号:

step1创建信号  所有的信号都是 `django.dispatch.Signal` 的实例、那么在项目某个app下创建 名为 `custom_signals.py` 的文件,如下这么写:

# filename: custom_singals.py

import django.dispatch

# 声明了一个 `pizza_done` 信号,它将为接收者提供 `toppings`, `size` 参数
# 可以在任何时候更改这个参数列表
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

step2 配置信号回调函数 在项目某个app下创建 名为 `register.py` 的文件,如下这么写:

# filename: register.py
# 注册信号使用

from app01.custom_singals import pizza_done

def pizza_done_func(sender, **kwargs):
    print("msg:", sender, kwargs)

pizza_done.connect(pizza_done_func)

step3 注册信号 项目启动的时候要将这些信号注册,那么在对应 `app` 的 `apps.py` 文件中如下

# filename: app_name/apps.py

from django.apps import AppConfig

# `django` 工具包中封装好的动态导入模块的方法
from django.utils.module_loading import import_module  

class App01Config(AppConfig):
    name = 'app01'

    def ready(self):
        # 项目启动所有 `app` 的 `ready` 方法下的代码均会执行
        import_module("app01.register")  # 注册信号

step4: 发送信号 事先定义 一组 `url` 映射关系,在视图业务操作中发送我们的信号( 有俩种发送信号的方法 )

from django.shortcuts import HttpResponse
from app01.custom_singals import pizza_done

class PizzaStore:

    def send_pizza(self, toppings, size):
        # 发送信号
        pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
        # "OR"   上下俩个方法是等价的, 区别 ~ ~
        pizza_done.send_robust(sender=self.__class__, toppings=toppings, size=size)

def index(request, ):
    # 业务操作, 执行信号发送操作
    PizzaStore().send_pizza(")
    return HttpResponse("ok")

django信号的更多相关文章

  1. Django 信号signal

    序言 Django自带一套信号机制来帮助我们在框架的不同应用位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将信号(signals)发送给一组接收者(r ...

  2. 信号(Django信号、Flask信号、Scrapy信号)

    简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...

  3. Django信号机制相关解释与示例

    Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...

  4. Django 信号使用问题

    Django 信号使用问题: 在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发.百度&官方文档找到了答案 1.信号的函数应该放在哪里? 这段代码应该放在哪里? 严格 ...

  5. flask,scrapy,django信号

    简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...

  6. pythonのdjango 信号

    一.内置信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Model signals pre_init # d ...

  7. django信号浅谈

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_in ...

  8. Django 信号

    信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到. 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生. 这在多处代码和同一事件 ...

  9. Django 信号、中间件、i18n 专题

    信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1. Django内置信号 Model signals pr ...

随机推荐

  1. [HNOI2010]城市建设

    [HNOI2010]城市建设 玄学cdq O(nlog^2n)的动态最小生成树 其实就是按照时间cdq分治+剪枝(剪掉一定出现和不可能出现的边) 处理[l,r]之间的修改以及修改之后的询问,不能确定是 ...

  2. 洛谷P3480 KAM-Pebbles

    题目大意: 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件.谁没有石子可移时输掉游戏.问先手是 ...

  3. TensorFlow 辨异 —— tf.placeholder 与 tf.Variable

    https://blog.csdn.net/lanchunhui/article/details/61712830 https://www.cnblogs.com/silence-tommy/p/70 ...

  4. SpringBoot入门:Hello World

    1.Open IDEA,choose "New-->Project" 2.Choose "Spring Initializr" 3. Choose jav ...

  5. Hadoop大数据通用处理平台

    1.简介 Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算,适合大规模数据.流式数据(写一次,读多次),不适合低延时的访问.大量的小文件以及频繁修改的文件. *Hadoo ...

  6. Person Transfer GAN to Bridge Domain Gap for Person Re-identification

    目录 相关背景 主要内容 MSMT17 Person Transfer GAN(PTGAN) 总结 注:原创不易,转载请务必注明原作者和出处,感谢支持! 相关背景 行人再识别(Person Re-id ...

  7. Eclipse使用JDBC小案例

    JDBC(Java Database Connectivity:Java访问数据库的解决方案)定义一套标准接口,即访问数据库的通用API,不同数据库厂商根据各自数据的特点去实现这些接口. JDBC是J ...

  8. SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

    笔者最近捣鼓Simulink,发现MATLAB的仿真模块真的十分强大,以前只是在命令窗口敲点代码,直到不小心敲入simulink,就一发不可收拾.话说simulink的模块化建模确实方便,只要拖拽框框 ...

  9. 中国 A 股纳入 MSCI

    1 .什么是 MSCI MSCI 是美国指数编制公司 --- 美国明晟公司的简称. 是一家股权,固定资产,对冲基金,股票市场指数的供应商. MSCI 旗下编制了多种指数,他们把全球股票市场分成发达国家 ...

  10. Redis代码——Python篇

    需要安装的库:redis import redis # 连接数据库 r = redis.StrictRedis(host="localhost", port=6379, passw ...