Django的信号功能怎样使用?下面我将通过实例来给大家介绍。
场景
有如下场景, 我有一个Model名为Alert,表示一条告警. 我需要在创建一个告警后进行邮件通知. 怎么实现呢?
繁琐的实现
Alert类加一个表示字段is_notify表示是否通知过. 然后创建一个command,在后台定时读取Alert里未通知的记录:
for alert in Alert.objects.filter(is_notify = False):
# 发邮件
alert.is_notify = True
这种方式有如下缺点:
- 需要创建一个后台进程
- 需要增加一个字段标识是否通知
- 后台进程的维护,如挂掉了,那么邮件通知不就终止了...
信号解耦
下面看一下使用django 信号实现上面的功能:
@receiver(post_save, sender=Alert)
def alert_notify(sender, instance, created, **kwargs):
if not created:
return
# 发送邮件
有没有觉得很简单呢, 只需要监听django的信号就可以知道所关心的对象的创建,然后做想做的事.
信号的使用
比如我这里有一个django app名为app
- app/init.py:
default_app_config = 'app.apps.AppConfig'
- app/apps.py:
from __future__ import unicode_literals
import os
from django.apps import AppConfig
class AppConfig(AppConfig):
name = 'app'
def ready(self):
# registers some single
import app.signals
- app/signals.py
@receiver(post_save, sender=Alert)
def alert_notify(sender, instance, created, **kwargs):
if not created:
return
# 发送邮件
信号的好处
使用Django信号不进可以实现一些高级功能,还能很好的解耦代码.
Django里有很多信号,下面列举一些
- Model signals:
- pre_init 某个实例马上要初始化了
- post_init 某个实例已经初始化了
- pre_save 个实例即将要保存入库了
- post_save 某个实例即已经保存入库了
- pre_delete 某个实例即将要删除了
- post_delete 某个实例即已经删除了
- Request/response signals
- request_started :http请求开始
- request_finished :http请求结束
如果信号不满足要求,还可以自定义信号. 详细可以看看官方文档