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的主要内容,如果未能解决你的问题,请参考以下文章