当前位置: 首页 > news >正文

【Django项目开发】django的信号机制(八)

在这里插入图片描述


文章目录

  • 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

相关文章:

  • 设计衣服的网站/新营销模式有哪些
  • 做网站发广告/谷歌网页版入口
  • 上海有名的广告公司/商丘网站优化公司
  • 有多人做网站是个人备案/一键开发小程序
  • 机械加工外协网站/最优化方法
  • wordpress消息通知/建站seo推广
  • JUC面试(一)——JUCJMMvolatile 1.0
  • Xinlinx zynq7020国产替代 FMQL20S400 全国产化 ARM 核心板+扩展板
  • Go语言开发小技巧易错点100例(五)
  • 算法leetcode|31. 下一个排列(rust重拳出击)
  • SpringCloud-Netflix学习笔记03——什么是Eureka
  • 测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办
  • springboot 项目自定义log日志文件提示系统找不到指定的文件
  • 【数据结构与算法】顺序表的原理及实现
  • 【C进阶】动态内存管理
  • GTD之初总结
  • 【Unity URP】设置光源层Light Layers
  • c语言小练pintia1-10