django(12)、信号

内置信号

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,update),自动触发
class_prepared    # 程序启动时,检测到已注册的model类,对于每一个类,自动触发
request_started     # 请求到来前,自动触发
request_finished    # 请求结束后,自动触发
got_request_exception           # 请求异常时,自动触发
setting_changed     # 配置文件改变时,自动触发
template_rendered   # 模板执行渲染操作时,自动触发
connection_created  # 创建数据库连接时,自动触发

内置信号使用:以pre_savepost_save为例,

# 项目目录 init.py

# 1、导入需要引用的内置信号
from django.db.models.signals import pre_save, post_save 

# 2、自定义功能函数
def pre_save_func(sender, **kwargs):
    print('pre_save_fun')
    print('pre_save_msg:', sender, kwargs)

def post_save_func(sender, **kwargs):
    print('post_save_func')
    print('post_save_msg:', sender,kwargs)

# 3、绑定功能函数到信号
pre_save.connect(pre_save_func)  # 在save对象前触发
post_save.connect(post_save_func)  # 在save对象后触发

# 4、打印结果
pre_save_fun
pre_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F990>, 'instance': <Author: kate>, 'raw': False, 'using': 'default', 'update_fields': None}
post_save_func
post_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F9F0>, 'instance': <Author: kate>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}


自定义信号

  • 1、创建文件, 定义信号:

    # /utils/signal_test.py
    # step1:实例化signal对象
    import django.dispatch
    action=django.dispatch.Signal(providing_args=["aaa","bbb"])
  • 2、在项目应用的init文件中完成功能函数和绑定信号
    # django_review\__init__.py
    from utils.signal_test import action
    
    # step2:定义receiver(A function or an instance method which is to receive signals.)
    def pre_save_func(sender, **kwargs):
        print("pre_save_func")
        print("pre_save_msg:", sender, kwargs)
    
    # step3:Connect receiver to sender for signal.
    action.connect(pre_save_func)
  • 3、在视图函数中触发信号
    from utils.signal_test import action
    
    def index(request):
        books = Book.objects.all()
        author = Author.objects.create(name='kate1',gender=1)
    
        # step4:发送信号到所有连接的reciever(Send signal from sender to all connected receivers.)
        action.send(sender='create', aaa=author.name, bbb=author.get_gender_display())
        return render(request, 'index.html', locals())
  • 4、结果展示
    pre_save_func
    pre_save_msg: create {'signal': <django.dispatch.dispatcher.Signal object at 0x04287370>, 'aaa': 'kate1', 'bbb': '女'}
    [09/Aug/2018 11:00:50] "GET / HTTP/1.1" 200 990


信号和中间件的区别

  • 信号比中间件散布的范围更广。
  • 在后台的许多动作事件都可以触发内置的信号,从而执行与之绑定的函数
  • 也可以自定义信号扩展其功能
  • 而中间件常用的就只有四个函数,且仅在接受请求和返回请求的过程中起作用

源码分析

class Signal(object):
    """所有信号的基类"""

    def __init__(self, providing_args=None, use_caching=False):

        self.receivers = []
        if providing_args is None:
            providing_args = []
        self.providing_args = set(providing_args)

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
         """
        Connect receiver to sender for signal.

        Arguments:
            receiver
                A function or an instance method which is to receive signals.
                Receivers must be hashable objects.
        """
        pass

    def send(self, sender, **named):
        """
        Send signal from sender to all connected receivers.

        If any receiver raises an error, the error propagates back through send,
        terminating the dispatch loop. So it's possible that all receivers
        won't be called if an error is raised.

        Arguments:
            sender
                The sender of the signal. Either a specific object or None.

            named
                Named arguments which will be passed to receivers.
        Returns a list of tuple pairs [(receiver, response), ... ].
        """
        pass

原文地址:https://www.cnblogs.com/fqh202/p/9448056.html

时间: 2024-08-30 14:10:29

django(12)、信号的相关文章

django的信号

django的信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行. 1. Django内置信号 Model signals pre_init # django的model执行其构造方法前,自动触发 post_init # djan

Django signal 信号

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

Django之信号

一.什么是信号 Django 提供一个"信号分发器",允许解耦的应用在框架的其它地方发生操作时会被通知到.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 二.Django内置信号 Model signals:     pre_init                # django的modal执行其构造方法前,自动触发     post_init               # django的modal执行其构造方法后,自动触发     pre_save   

Django的信号机制

Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的callback函数就会执行. Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的mo

Django signal 信号机制的使用

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

【Django】信号调度

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

django 自定义信号 1.11

django 还支持自定义信号 需要步骤 1. 创建信号 import django.dispatch # 信号名 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) 这个信号名相当于 django 内置的信号 导入的模块一样 from django.core.signals import request_finished from django.core.signals

10.12 信号集

我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数sigprocmask等函数中使用这些数据结构(下一节中),用于告知内核不要允许集合中的信号出现,正如我们早些时候提到的,不同信号的数量可能会超过一个整形变量的Bit数量,所以通常来说,我们不能使用整形变量中的每一个Bit来存储每一个信号.POSIX.1定义了数据结构sigset_t用存储信号集,并且允许如下五个函数对其进行操作: #include<signal.h> int sigemptyset(sigset_t*se

Django缓存,信号,序列化

缓存 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户. 2.Django提供了6种缓存方式 开