Django 信号signal

Posted wcwnina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 信号signal相关的知识,希望对你有一定的参考价值。

序言

Django自带一套信号机制来帮助我们在框架的不同应用位置之间传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将信号(signals)发送给一组接收者(receivers),此时接收者进行一些相关处理动作。

信号系统包含以下三要素:

  • 信号:Signal对象
  • 发送者:信号发出方
  • 接收者:信号接收方

Django内置了一整套信号,下面是一些比较常用的:

  • django.db.models.signals.pre_save & django.db.models.signals.post_save    在ORM模型的save()方法调用之前或之后发送信号
  • django.db.models.signals.pre_delete & django.db.models.signals.post_delete    在ORM模型或查询集的delete()方法调用之前或之后发送信号
  • django.core.signals.request_started & django.core.signals.request_finished    当接收和关闭HTTP请求时发送信号
  • django.db.models.signals.m2m_changed    当多对多字段被修改时发送信号

以上可以看出,信号和数据库触发器在某种程度上有些相似。

接下来看看Django信号如何使用,可分为内置信号和自定义信号。

使用内置信号

内置信号使用起来很简单,最方便的是采用receiver装饰器。

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished, sender=Myclass)
def signal_handler(sender, **kwargs):
    print("请求完成!")

装饰器将处理函数注册成接收器,当内置信号发送后,此处理函数立即执行。

使用自定义信号

首先在根URLConf中写一条路由:

# 信号测试
url(r^signal/$, signal_sender),

自定义一个信号:

from django.dispatch import receiver, Signal

test_signal = Signal([hostname, msg, time])

编写视图:

import datetime
import os
import django
from django.dispatch import receiver, Signal
from django.http import HttpResponse

# 发送信号
def signal_sender(request):
    hostname = request.get_host()
    msg = Django Signal Test
    time = datetime.date.today()
    test_signal.send(sender=signal_sender, hostname=hostname, msg=msg, time=time)     # 关键一行
    return HttpResponse(200 OK)


# 接收和处理信号
@receiver(test_signal, sender=signal_sender)      # 装饰器把处理函数注册成接收器
def signal_handler(sender, **kwargs):         # kwargs字典接收信号参数
    print(接收到信号内容:{hostname}|"{msg}"|{time}.format(hostname=kwargs[hostname], msg=kwargs[msg], time=kwargs[time]))

现在可以来测试一下,python manage.py runserver启动服务器。浏览器中访问 http://127.0.0.1:8000/signal/。重点不再浏览器的返回,而在后台返回的内容:

接收到信号内容:www.wcwnina.com:8888|"Django Signal Test"|2018-12-08

 

  至此。转载请注明出处。

技术分享图片

以上是关于Django 信号signal的主要内容,如果未能解决你的问题,请参考以下文章

Celery Signals与Django Signals

Django 信号 Signals

Django signal 信号机制的使用

Django 详解 信号Signal

信号 signal

Django中的信号