django的信号Signal机制

原创来自作者:https://www.jianshu.com/u/86a999e02b45

一、信号Sender:

略,具体参考官方文档

二、信号Receiver:

略,具体参考官方文档

三、自定义reveiver的触发:

在实际开发中会发现,按照官方文档定义好信号接收器后,并不能正常接收到信号。比如在app device中定义signals.py文件,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# jrzhaoxueyong @ 2018年09月28日20:30:08

import logging

from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import Device

# Get an instance of a logger
logger = logging.getLogger(__name__)


@receiver(post_save, sender=Device)
def device_save_signal(sender, **kwargs):
    """
    设备保存成功信号
    """
    logger.info('device post save: %s' % kwargs)

按照预期Device这个model保存的时候会触发该signal。但是实际却没有触发,这是为什么呢?原来要想触发该receiver,还有如下几步需要做,官网中没有提到。

3.1. apps.py中引入包:

from django.apps import AppConfig


class DeviceConfig(AppConfig):
    name = 'device'

    def ready(self):
        import device.signals # pylint: disable=W0612

3.2. 在settings.py中修改device包引入方式:

INSTALLED_APPS = [
    ...
    #'device'改成'device.apps.DeviceConfig'
    'device.apps.DeviceConfig',
    # 默认情况下我们通常叫做device,但是因为信号需要在自定义的AppConfig中触发,因此必须把
    # device修改为 device.apps.DeviceConfig,这样才能触发信号
     ...
]

这样就能正常加载信号receiver了。

你可能感兴趣的:(django的信号Signal机制)