def send_robust(self, sender, **named): passsender 标识信号的发送者,大多数情况下它是一个类对象;**named 用来指定任意数量的关键字参数,这些参数将会传递给 receiver。
def connect(self, receiver, sender=None, weak=True, dispatch_uid=None): pass这个方法接受四个参数,但是只有 receiver 参数是必需的,我们分别对这些参数进行讲解:
def disconnect(self, receiver=None, sender=None, dispatch_uid=None): pass可以看到它的定义和 connect 方法的参数是相似的,它的参数含义如下所示:
def request_started_callback(sender,**kwargs): print("请求开始:%s"%kwargs['environ']) def request_finished_callback(sender,**kwargs): print("请求完成")从上述代码可以看出它们就是普通的 Python 函数,它们接受一个 sender 参数和一个关键字参数 **kwargs,这也是 Django 规定的信号接收者的固定格式,我们可以从 kwargs 中获取到信号发送的关键字参数,如在 request_started_callback 中获取到 environ。定义完成了回调函数,接下来第二步就需要把相关的信号导入,第三步就是回调函数注册到信号上,如下所示:
from django.core.signals import request_started, request_finished request_started.connect(request_started_callback) request_finished.connect(request_finished_callback)
from django.core.signals import request_started, request_finished #与http有关的内置信号 from django.dispatch.dispatcher import receiver @receiver(request_started) def request_started_callback(sender,**kwargs): #获取程序执行的环境信息 print("请求开始:%s"%kwargs['environ']) @receiver(request_finished) def request_finished_callback(sender,**kwargs): print("请求完成")装饰器 receiver() 的第一个参数是可迭代的对象,可接受一个列表,其中每一个元素都是信号实例。这两种方法选择其一即可,完成了信号的注册以后,我们就可以访问以前定义的任何一个视图函数,在 CMD 命令行可以看到,视图函数的执行前后都打印了对应的内容,这就是内置信号应用的基本流程。
import django.dispatch from django.dispatch import receiver #创建一个信号 from user.models import User register_signal=django.dispatch.Signal(providing_args=["request","user"])#触发的时候需要传递的参数 #定义回调函数(即信号接收者)并使用装饰器进行注册 @receiver(register_signal,dispatch_uid="register_callback") def register_callback(sender,**kwargs): print("客户端地址:%s,邮件接收者:%s"%(kwargs['request'].META['REMOTE_ADDR'],kwargs['user'].email))我们在这个文件中实现了信号的创建,信号的接收以及通过 receiver() 完成了信号的注册,然后我们在 user/views.py 中定义一个视图函数:
from user.signals import register_signal def hello_my_signal(request): #注意要和回调函数中的**kwargs的参数保持一致 #参数 sender(信号发送者指函数) **named(**kwargs参数相同) register_signal.send(hello_my_signal,request=request,user=User.objects.get(username="admin")) print("注册成功已经发送邮件") return HttpResponse('Hello signal')通过这个视图函数,我们模拟用户登录后发送邮件的情景。定义好路由映射,然后访问 127.0.0.1:8000/user/signal/,最后在 CMD 命令行输出如下结果:
客户端地址:127.0.0.1,邮件接收者:admin@163.com
这样我们就通过了自定义信号模拟实现了上述场景中的功能。通过对内置信号执行过程介绍以及内置和自定义信号的实例应用,我们对 Django 的信号机制使用有了更加深入的理解,在下一节中我们将从 Python 语言的特性讲解 Django 信号机制的工作原理。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有