码迷,mamicode.com
首页 > 其他好文 > 详细

Django 信号signal

时间:2018-12-08 17:55:50      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:不同   数据   访问   return   django   服务   相关   现在   比较   

序言

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

标签:不同   数据   访问   return   django   服务   相关   现在   比较   

原文地址:https://www.cnblogs.com/wcwnina/p/10088239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!