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了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容