Django:信号的使用

信号

  • 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})
触发信号:单独写文件,如果在视图函数写函数,当代码取消,不方便。如果单独写函数,虽然添加信号会繁琐,但功能不需要取消时候,就方便许多。

原文地址:https://www.cnblogs.com/xujunkai/p/11848668.html

时间: 2024-08-29 22:45:50

Django:信号的使用的相关文章

自动化运维Python系列之Django信号、缓存操作

Django信号 Django内部提供了一种"信号强度"处理机制,简单理解就是当Django在接收到请求后内部做某些特定操作前发出信号,提醒一些接受者或者做操作,这样的好处就是方便程序定制小功能插件,也是对本身框架的一种节藕操作 1)Django的内置信号 Model signals     pre_init                # django的modal执行其构造方法前,自动触发     post_init               # django的modal执行其构

Django信号

Django信号 Django提供一个"信号分发器",永许解耦的应用在框架的其它地方发生操作时会被通知到 也就是说在特定事件发生时, 可以发送一个信号去通知注册这个信号的一个或者多个回调,在回调里进行逻辑处理 如何监听信号 - 拥有一个Signal实例 - 信号回调 - 将信号回调绑定到Signal实例 - 在特定事件中Signal发送信号 Django内置信号 - django.db.model.signals.pre_save & post_save 在模型 seve()

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

简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 下面,分别介绍一下三种信号的使用示例. Django信号 很多数情况下,我们需要在操作数据库之前或者之后做某些操作,比如说写个日志之类的,我们当然可以找到每一个sql语句,在其前后加一段代码, 但是,这不但浪费时间,

django 信号 目录 1.11

django 信号介绍 1.11 django 自定义信号 1.11 原文地址:https://www.cnblogs.com/mingerlcm/p/10242073.html

flask,scrapy,django信号

简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 下面,分别介绍一下三种信号的使用示例. Django信号 很多数情况下,我们需要在操作数据库之前或者之后做某些操作,比如说写个日志之类的,我们当然可以找到每一个sql语句,在其前后加一段代码, 但是,这不但浪费时间,

Django 信号

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 相当于我们创建了一个hook. 1. 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      

23:django 信号(signal)

django包含了一个“信号分配器”使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作. 为此,django提供了很多内置的信号,比如一些常用的功能(以几个在django.db.models.signal目录下的信号为例): save:pre_save和post_save delete:pre_delete和post_delete chang

django信号相关

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_del

[TimLinux] Django 信号

1. 信号定义 django包含有一个"信号分发器",在框架内任何时候,在任何地方,有动作方式是,用来帮助解耦应用之间获取通知.简言之,信号允许特定的发送者通知一系列接收者动作已经发生了.特别有用的地方在于:许多代码片段对于同样的事件感兴趣. 2. 内建信号 django提供了许多内建的信号,这样用户代码能够在django自身的一些特定动作发生时得到通知.如下: django.db.models.singals.pre_save.django.db.models.signals.pos

django信号调度的用法

Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signals pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Django中的model对象保存前,自动触发 post_save # Django中的model对象保存后,自动触发 p