def send_robust(self, sender, **named):
pass
sender 标识信号的发送者,大多数情况下它是一个类对象;**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号
广州松河信息科技有限公司 版权所有