原创来自作者: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了。