Django 信号使用简介

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请求结束

如果信号不满足要求,还可以自定义信号. 详细可以看看官方文档

 

Spread the word. Share this post!

Meet The Author

Leave Comment