django信号

什么是信号?

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

  --为了实现代码层解耦 

  村长博客: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("chicken", "40")
    return HttpResponse("ok")

 

posted @ 2019-04-04 02:25  yunfengding  阅读(220)  评论(0编辑  收藏  举报