信号

  • Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
  • 应用:比如插入数据到数据库,插入之前写日志,插入之后写日志。
Model signals
pre_init # django的model执行其构造方法前,自动触发
post_init # django的model执行其构造方法后,自动触发
pre_save # django的model对象保存前,自动触发
post_save # django的model对象保存后,自动触发
pre_delete # django的model对象删除前,自动触发
post_delete # django的model对象删除后,自动触发
m2m_changed # django的model中使用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 # 创建数据库连接时,自动触发

1.信号用法一:

  • 对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数,注册信号,写入与project同名的文件夹下的__init__.py文件中,也是换数据库引擎的地方。这里拿post_save举例

    • __init__.py
    # post_save:django的model对象保存后,自动触发
    from django.db.models.signals import post_save
    def callback(sender,**kwargs):
    print("执行post_save信号")
    print(sender,kwargs) post_save.connect(callback)#信号连接,并调用回调函数
    • views.py
    def student_list(request):
    students = models.Student.objects.all()
    print(students)
    models.Student.objects.create(name='xxoo')#创建一个对象,用于触发信号
    return render(request,'stu.html',{"students":students})

2.信号用法二:

  • 通过装饰器receiver,也可以添加多个信号
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save)# django的model对象保存后,自动触发
def callback(sender,**kwargs):
print("执行post_save信号")
print(sender,kwargs) post_save.connect(callback) @receiver(pre_save)# django的model对象保存前,自动触发
def callback2(sender,**kwargs):
print("执行pre_save信号")
print(sender,kwargs) pre_save.connect(callback2)

3.自定义信号:

  • 在一个py文件定义信号!sig.py
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])#toppings,size自己定义字段
  • __init__.py中注册信号
from sig import pizza_done
def callback(sender, **kwargs):
print("callback")
print(sender, kwargs) pizza_done.connect(callback) #触发后打印结果:
callback seven {'signal': <django.dispatch.dispatcher.Signal object at 0x000001BCD6D82B38>, 'toppings': 123, 'size': 456}
  • 在视图函数触发信号由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发

    from django.shortcuts import render
    from app01 import models from sig import pizza_done def student_list(request):
    students = models.Student.objects.all()
    pizza_done.send(sender='seven', toppings=123, size=456)#给sig中定义的字段传值,发起信号者赋值
    return render(request,'stu.html',{"students":students})
触发信号:单独写文件,如果在视图函数写函数,当代码取消,不方便。如果单独写函数,虽然添加信号会繁琐,但功能不需要取消时候,就方便许多。

最新文章

  1. ASP.NET Forms 身份验证
  2. Coursera系列-R Programming第二周
  3. 30、shiro框架入门2,关于Realm
  4. virtualbox usb连接问题解决
  5. MongoDB 分片操作
  6. JAVA的IO学习
  7. 初窥Linux 之 文件权限
  8. MyBatis的类型自定义映射
  9. hdu 6194 沈阳网络赛--string string string(后缀数组)
  10. SPOJ SERGRID - Grid BFS
  11. insertBefore方法(javascript与jQuery)
  12. WinServer-FTP搭建
  13. 【Visual Studio 扩展工具】使用ComponentOne中的GroupDefinition和SortDefinition属性保存和还原布局
  14. css 如何“画”一个抽奖转盘
  15. 20155229《网络对抗技术》Exp4:恶意代码分析
  16. 使用Snap.svg类库实现的抖动式的幻灯播放效果
  17. RabbitMq 之简单队列
  18. geoserver 问题解决
  19. 1347: Last Digit (周期函数)
  20. 第二章 Java浮点数精确计算

热门文章

  1. C# Microsoft.Office.Interop.Owc11 导出excel文件
  2. pymysql装饰器封装
  3. 用shedlock实现分布式定时任务锁
  4. kotlin基础 常见容器的取值范围
  5. django中安全sql注入等
  6. js数组、对象处理
  7. 带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc
  8. Docker网络模式介绍
  9. 小技巧——解决Github项目clone慢的问题
  10. Gerrit - Gerrit与GitLab集成