博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django信号
阅读量:5883 次
发布时间:2019-06-19

本文共 2773 字,大约阅读时间需要 9 分钟。

什么是信号?

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

  --为了实现代码层解耦 

  村长博客: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.pyimport 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_donedef pizza_done_func(sender, **kwargs):    print("msg:", sender, kwargs)pizza_done.connect(pizza_done_func)

 

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

# filename: app_name/apps.pyfrom 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 HttpResponsefrom app01.custom_singals import pizza_doneclass 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")

 

转载于:https://www.cnblogs.com/dingyunfeng/p/10652698.html

你可能感兴趣的文章
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>