Signals是Django自带的一个信号调度程序。如果你对svn或者git之类的hooks有了解,这个理解起来就简单多了,通俗来说就是当你的程序产生一个事件时,会通过signals自动触发其他的事件。就比如我们这个工单系统通知,当工单状态产生变化时自动发送邮件给相关人。
Django内部已经定义好了一些signal供我们使用,如果不能满足我们也可以自定义signal,其中Django内部定义的signal主要分为几类
model signals
pre_init:model初始化前触发
post_init:model初始化后触发
pre_save:save()方法前触发
post_save:save()方法后触发
pre_delete:delete()方法前触发
post_delete:delete()方法后触发
m2m_changed:ManyToManyField字段改变时触发
class_prepared:没用过字面意思理解吧
management signals
pre_migrate:migrate之前触发
post_migrate:migrate之后触发
request/response signals
request_started:请求开始时触发
request_finished:请求完成后触发
got_request_exception:请求异常时触发
test signals
setting_changed:配置改变时触发
template_rendered:模板渲染时触发
Database Wrappers
connection_created:连接建立时触发
那么信号究竟该如何使用呢?下边一个实际的例子来说明下信号的使用
就以我们发送通知的需求为例,workflow是一个普通的app,第一步需要新建workflow/signals.py文件绑定signal
from django.db.models import signals from django.dispatch import receiver from workflow.models import Ticket from workflow.backends.notify import Notify @receiver(signals.post_init, sender=Ticket) def migrate_notify_init(instance, **kwargs): instance.old_state = instance.state @receiver(signals.post_save, sender=Ticket) def migrate_notify_post(instance, created, **kwargs): if created or instance.old_state != instance.state: Notify().migration(instance.id)这里用到了两个signal,post_init和post_save
在model初始化之后通过post_init信号获取到state的值作为初始状态值,在每次model执行save方法后调用post_save信号获取到新的状态值,对两次状态值做比较如果不一致则表示状态有更新发送通知
是上边的判断只能判断到状态变更了发通知,但工单在第一次创建时old_state和state是一样的,所以也需要在save之后判断下这次操作是不是新建,如果是新建同样需要发送通知
第二步加载signal,需要修改两个配置文件
config1:workflow/apps.py
from django.apps import AppConfig class WorkflowConfig(AppConfig): name = 'workflow' def ready(self): import workflow.signalsconfig2:workflow/__init__.py
default_app_config = 'workflow.apps.WorkflowConfig'绑定成功后就可以在每次工单状态发生变化时发送邮件了
如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:
Django model转字典的几种方法
Django配置Celery执行异步任务和定时任务