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

news2024/10/5 19:14:22

在这里插入图片描述


文章目录

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.1总线概述

文章目录一、总线简图二、概念与分类1.总线定义2.总线特点(1)分时(2)共享3.总线特性4.总线的分类(1)按数据传输格式①串行总线②并行总线(2)按总线功能①片内总线②系统总线③通信总…

【原创】linux实时应用如何printf输出不影响实时性?

linux实时应用printf输出 文章目录linux实时应用printf输出1. 前言2. linux终端输出3. 常见的NRT IO输出方案3.1 一种实现方式3.3 改进3. Xenomai3 printf()接口3.1 应用运行前环境初始化1. GCC特定语法2. libcobalt printf初始化流程3.2 libcobalt printf内存管理1. print_buf…

我的周刊(第074期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目code-server[1]这是一款开源的基于 VSCode 的在线编…

【Linux系统】第四篇:Linux中编辑器vim的使用

文章目录一、vim的介绍1、vim的基本模式2、vim的使用二、命令模式1、光标移动操作2、文本复制、粘贴、剪切、撤销操作3、文本编辑相关操作三、插入模式四、底行模式底行模式命令集五、vim的配置原理六、sudo无法提权问题一、vim的介绍 vim是Linux下的一款多模式编辑器。 注意…

【已解决】右键以某应用打开xx文件时,没有“始终”选项怎么办

问题解决方案简单来说详细操作解释问题 右键以某应用打开xx文件时,没有“始终”选项 解决方案 简单来说 在注册表:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\找到要打开的文件后缀名,删除…

2022尚硅谷SSM框架跟学(五)Spring基础二

2022尚硅谷SSM框架跟学 五Spring基础二3.AOP3.1场景模拟3.1.1声明接口3.1.2创建实现类3.1.3创建带日志功能的实现类3.1.4提出问题(1)现有代码缺陷(2)解决思路(3)困难3.2代理模式3.2.1概念(1)介绍(2)生活中的代理(3)相关术语3.2.2静态代理3.2.3动态代理3.2.4测试3.3AOP概念及相关…

视频 | 生信 linux 实战题目讲解03

点击阅读原文跳转完整教案。1 Linux初探,打开新世界的大门1.1 Linux系统简介和目录理解1.1.1 为什么要用Linux系统1.1.2 Linux系统无处不在1.1.3 免费的Linux系统来一套1.1.4 Linux系统登录-联系远方的她1.1.5 初识Linux系统 - 黑夜中的闪烁是你的落脚点1.1.6 我的电…

使用混沌和非线性控制参数来提高哈里斯鹰优化算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

华为路由汇总实验

目录 OSPF路由聚合实验 在ABR上做路由聚合 在ASBR上做路由聚合 BGP路由聚合实验 在AR4-1上做静态聚合 在AR6-3上做手动聚合 ISIS路由聚合实验 R1配置路由聚合 OSPF路由聚合实验 OSPF——基本概念5(汇总、更新、认证)_静下心来敲木鱼的博客-CSDN博…

华为MPLS单域实验配置

目录 配置AS内的MPLS LDP协议 配置PE-PE之间的MP-BGP协议 在PE上配置VPN实例 在CE侧配置PE-CE的路由协议 在PE侧配置PE-CE的路由协议 在PE侧将CE的路由重发布进MP-BGP中 在CE侧将MP-BGP的路由重发布进CE中 MPLS隧道——单域基础理论讲解_静下心来敲木鱼的博客-CSDN博客h…

SPSS常用的10种统计分析

目录 实验一 地理数据的统计处理 一、实验目的 二、实验内容 三、实验步骤 实验二 双变量相关分析 一、实验目的 二、实验内容 三、实验步骤 实验三 主成分分析 一、实验目的 二、实验内容 三、实验步骤 实验四 因子分析 一、实验目的 二、实验内容 三、实…

【Linux】缓冲区 进度条小程序

目录 一、\r && \n 二、缓冲区的概念 三、小程序编写 1、倒数小程序 2、进度条小程序 一、\r && \n C语言中有很多字符,但是宏观上可以分成两类:可显字符、控制字符。 可显字符包括我们见到的 1、2、3....,a、b、c....…

历史最全事件抽取任务分类、经典论文、模型及数据集整理分享

事件抽取技术是从非结构化信息中抽取出用户感兴趣的事件,并以结构化呈现给用户。事件抽取任务可分解为4个子任务: 触发词识别、事件类型分类、论元识别和角色分类任务。其中,触发词识别和事件类型分类可合并成事件识别任务。事件识别判断句子中的每个单词…

Linux面试题

Linux 概述 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想…

Java使用Zxing二维码生成

目录 1、二维码简介 二维码纠错级别 2、ZXing简介 3、示例 3.1 搭建一个maven项目,引入Zxing依赖包 3.2 创建QrCodeUtil.java 类 1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录…

C++ 001:C++ 基础语法

1. 开始之前 1.1 学习路线 这次我是下定决心要学 C 了,而且是系统地,不半途而废地学习 C 了~ 有这个新专栏为证~ 由于某次偶然的机会,我看见了一张 C 竞赛的学习路线表(这里由于表格内容太多就不贴出来)&#xff0c…

Xinlinx zynq7020国产替代 FMQL20S400 全国产化 ARM 核心板+扩展板

TES720D 是一款基于FMQL20S400 的全国产化核心 模 块 。 该核心 模 块 将FMQL20S400 (兼容FMQL10S400)的最小系统集成在了一个 50*70mm 的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用在控制领域&#xff0…

【Java】的面向对象笔记(中)

继承性基础 哲学三问 什么是继承性 银行卡有很多种,有借记卡、信用卡、亲情卡、工资卡等等,他们各有不同,但都具有相同的银行卡特征,即余额、卡号等共有的属性,如果每定义一个类都需要写一次,那就太麻烦…

word、excel文档内容更新技术方案

需求背景 惯例先说下背景。 生产、研发业务上往往使用大量word和excel文档来作为资料载体,如操作规程、控制手册、卡片……,这些文档会反复使用到一些设备、工艺等参数数据。参数属性主要是名称、编码、正常范围、报警上下限、单位等,这些参…

SQL---DDL

目录 一、数据库的相关概念 二、MySQL数据库 1. 关系型数据库(RDBMS) 2. 数据数据库 3. MySQL客户端连接的两种方式 方式一:使用MySQL提供的客户端命令行工具 方式二:使用系统自带的命令行工具执行指令 三、SQL SQL的…