文章目录
- 1、什么是信号
- 2、代码实现
- 3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制
1、什么是信号
通俗来说,信号就是通信双方约定的一种信息通知方式,双方通过信号来确定发生了什么事情,然后决定自己应该做什么。
Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候,系统会根据信号定义的函数执行相应的操作
Django 中的信号主要包含以下三个要素:
发送者(sender):信号的发出方。
信号(signal):发送的信号本身。
接收者(receiver):信号的接收者
通知是信号中最常用的场景,比如当一个用户登录成功后,给该用户发送通知消息,或者在论坛、博客当你更新话题或者动态。就可以使用信号做信息的推送;当你的发布的动态有其他的用户给你评论的时候,也可以使用信号来通知你。
每当新增一个功能菜单的时候,初始化它对应的权限
例如:增加业务管理菜单,自动赋予它增删改查的权限
2、代码实现
import logging
from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import MenuModel, PermissionsModel
logger = logging.getLogger('erp')
methods = {'POST': '新增', 'GET': '查询', 'PUT': '修改', 'DELETE': '删除'}
#函数在创建菜单的时候自动调,不是手动调
@receiver(post_save, sender=MenuModel)
def create_menus_permissions(sender, instance, created, **kwargs):
"""
sender:发送信号的人(其实就是菜单)
创建信号监控函数,信号接收者收到之后自动触发。创建菜单资源对应的权限
"""
if created:
logger.info('创建菜单资源对应的权限')
if isinstance(instance, MenuModel):
if not instance.parent: # 因为没有父菜单,所以menu就是功能模块菜单对象
permission = PermissionsModel.objects.create(name=instance.name + '的权限',
is_menu=True)
permission.menu = instance
permission.save()
else: # 当前菜单是接口
for method in methods.keys():
# permission = PermissionsModel.objects.create(name=f'{instance.name}的{methods.get(method)}的权限',
# is_menu=False, method=method, path=instance.url)
permission = PermissionsModel.objects.create(desc=f'{instance.name}的{methods.get(method)}的权限',
is_menu=False, method=method, path=instance.url,
name=methods.get(method))
permission.menu=instance
permission.save()
else:
logger.warning('当前对象不是MenuModel类型,所以不需要创建对应的权限数据')
3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制
当前的apps一加载,会自动执行ready函数
from django.apps import AppConfig
class ErpSystemConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'erp_system'
def ready(self):
import erp_system.signals