python中的装饰器,例子说明

在Python中,嵌套装饰器是指在一个函数上应用多个装饰器。每个装饰器都可以为函数添加一些特定的功能。以下是一个稍微复杂一些的例子,我们将创建一个记录日志和验证权限的嵌套装饰器。

### 例子:记录日志和权限验证的嵌套装饰器

假设我们正在开发一个简单的web应用,并且需要对某些视图函数进行日志记录和权限验证。

#### 1. 日志记录装饰器

首先,我们创建一个用于记录日志的装饰器:

```python
import functools
import time

def log_decorator(func):
    @functools.wraps(func)
    def wrapper_log(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time:.4f} seconds to execute.")
        return result
    return wrapper_log
```

#### 2. 权限验证装饰器

接下来,我们创建一个用于权限验证的装饰器:

```python
def permission_decorator(required_permission):
    def decorator(func):
        @functools.wraps(func)
        def wrapper_permission(*args, **kwargs):
            # 假设这是检查权限的逻辑
            user_permission = kwargs.get('permission', 'guest')  # 从函数参数中获取权限
            if user_permission == required_permission:
                return func(*args, **kwargs)
            else:
                print(f"Permission denied. Required: {required_permission}, provided: {user_permission}")
                return None
        return wrapper_permission
    return decorator
```

#### 3. 嵌套装饰器的应用

现在,我们可以在一个视图函数上应用这两个装饰器:

```python
@log_decorator
@permission_decorator(required_permission='admin')
def top_secret_data_view(user_id, permission):
    print(f"Showing top secret data for user {user_id}.")
    # 这里应该是获取和显示数据的逻辑
    return "Top secret data displayed."

# 调用函数,模拟用户权限为'admin'
top_secret_data_view(user_id=1, permission='admin')

# 调用函数,模拟用户权限为'user'
top_secret_data_view(user_id=1, permission='user')
```

输出结果:

```
Function top_secret_data_view took 0.0000 seconds to execute.
Showing top secret data for user 1.
Top secret data displayed.
Function top_secret_data_view took 0.0000 seconds to execute.
Permission denied. Required: admin, provided: user
```

在这个例子中,我们首先应用了`@log_decorator`来记录函数的执行时间,然后是`@permission_decorator`来验证调用者是否具有所需的权限。如果用户权限不足,函数将不会执行主要的逻辑,并且会打印出权限拒绝的消息。

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

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

相关文章

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

从0到1实现一个ui组件库

0.搭建vue pnpm create vue 1.下载依赖 {"name": "你的ui名","version": "1.0.6","type": "module","license": "MIT","keywords": ["vue3","components",&…

vue3 底层实现原理

设计思路 声明式UI(推荐使用): 即 template 形式(模板,模板的编译依赖于编译器),会被编译器的程序编译为渲染函数,再由渲染器渲染为真实 DOM 编译器:将模板编译为渲染函数,在编译的过程中编译器有能力分析动态内容,并在编译阶段把这些信息提取出来,把附带静动态属…

PyTorch的卷积和池化

卷积计算 input 表示输入的图像filter 表示卷积核, 也叫做滤波器input 经过 filter 的得到输出为最右侧的图像&#xff0c;该图叫做特征图 卷积的计算是将卷积核放入左上角&#xff0c;在局部区域间做点积&#xff0c;然后将卷积核在Input上面依次从左向右&#xff0c;从上到下…

免费证件照一键换底色

最近星期天在家搞了一个小工具&#xff0c;在这里分享下! 废话不多说看看效果&#xff1a; 效果还不错&#xff0c;需要的可以联系我!!!!!!!!! 别的网上可都是一次五块钱这种。太贵了。。&#xff01;&#xff01;

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

VS项目Debug下生成的EXE在生产机器上运行

使用Visual Studio开发应用程序时&#xff0c;为了临时在非开发机上看一下效果&#xff0c;就直接把Debug下的文件全部拷贝到该机器上&#xff0c;直接双击exe运行。双击之后&#xff0c;没有直接打开应用程序&#xff0c;而是弹出了一个Error弹框。  赶快在网上搜了一遍&…

整理好了!2024年最常见 100 道 Java基础面试题(四十一)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;四十&#xff09;-CSDN博客 八十一、equals 和 hashCode 的区别和联系&#xff1f; 在Java中&#xff0c;equals() 方法和 hashCode() 方法是对象比较和散列表&#xff08;如 Hash…

MFC窗口更新与重绘

窗口更新与重绘 窗口或控件更新其外观的情况通常包括以下几种&#xff1a; 窗口大小变化&#xff1a; 当用户调整窗口大小时&#xff0c;窗口的客户区大小会改变&#xff0c;需要重新绘制窗口内容以适应新的大小。 窗口重叠或暴露&#xff1a; 当窗口被其他窗口遮挡部分或完…

axios、fetch和ajax

axios、fetch和ajax都是在前端开发中用于发送HTTP请求的工具或技术&#xff0c;但它们之间存在一些明显的区别。 ajax&#xff1a; Ajax即Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是一种在2005年被提出的技术&#xff0c;用于…

「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标

美国网络安全和基础设施安全局&#xff08;CISA&#xff0c;CyberSecurity & Infrastructure Security Agency&#xff09;于2024年5月开始呼吁企业是时候将网络安全融入到技术产品的设计和制造中了&#xff0c;并发起了安全设计承诺行动&#xff0c;该承诺旨在补充和建立现…

Android13屏幕旋转的基本逻辑

1.问题 1.settings put system user_rotation 1是什么意思 答案&#xff1a;设置用户期望的屏幕转向&#xff0c;0代表&#xff1a;Surface.ROTATION_0竖屏&#xff1b;1代表&#xff1a;Surface.ROTATION_90横屏 2.设置user_rotation和GSensor哪个优先级更高&#xff0c;比…

「PHP系列」PHP MySQL 创建数据库/创建表/插入数据

文章目录 一、PHP MySQL 创建数据库二、PHP MySQL 创建表三、PHP MySQL 插入数据四、相关链接 一、PHP MySQL 创建数据库 要在 PHP 中使用 MySQL 创建数据库&#xff0c;你通常不能直接通过 PHP 脚本直接在数据库服务器上执行这个操作&#xff0c;因为创建数据库通常是一个管理…

Vue router(路由守卫)

全局路由守卫 全局前置守卫 (router.beforeEach): 位置&#xff1a;在src/router/index.js文件中配置。 作用&#xff1a;对任何路由跳转&#xff08;包括首次加载、手动导航、编程式导航&#xff09;进行统一拦截。 示例代码&#xff1a; const router new VueRouter({ /* .…

一个物业管理服务项目的思考——智慧停车场无人值守呼叫系统到电梯五方对讲再到呼叫中心

目录 起源智慧停车场无人值守呼叫系统然后电梯五方对讲系统又然后物业呼叫中心集控E控中心怎么做 之前介绍过一个关于 点这个链接&#xff1a;门卫、岗亭、值班室、门房、传达室如果距离办公室和机房比较远的情况下怎么实现电话通话&#xff0c;基本上属于物业管理服务的范围。…

强化学习在一致性模型中的应用与实验验证

在人工智能领域&#xff0c;文本到图像的生成任务一直是研究的热点。近年来&#xff0c;扩散模型和一致性模型因其在图像生成中的卓越性能而受到广泛关注。然而&#xff0c;这些模型在生成速度和微调灵活性上存在局限。为了解决这些问题&#xff0c;康奈尔大学的研究团队提出了…

【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标 1、掌握STM32的中断知识 2、学会STM32CubeMX软件关于中断的配置 3、具体目标&#xff1a;1、外部中断检测按键&#xff0c;每按一次计一次数&#xff0c;满5次LED1状态取反。 一、中断概述 1.1、中断定义 CPU执行程序时&#xff0c;由于发生了某种随机的事件(包括…

实验室纳新宣讲会(java后端)

前言 这是陈旧已久的草稿2021-09-16 15:41:38 当时我进入实验室&#xff0c;也是大二了&#xff0c;实验室纳新需要宣讲&#xff0c; 但是当时有疫情&#xff0c;又没宣讲成。 现在2024-5-12 22:00:39&#xff0c;发布到[个人]专栏中。 实验室纳新宣讲会&#xff08;java后…

基于GD32的简易数字示波器(4)- 软件

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c;帖子主要做学习记录&#xff0c;方便以后查看。 本期主要介绍GD32的keil5环境和串口下载。详细教程可观看下方链接。 软件-第1讲-工程模板新建_哔哩哔哩_bilibili 2.1 开发环境搭建 …

logback日志持久化

1、问题描述 使用logback持久化记录日志。 2、我的代码 logback是Springboot框架里自带的&#xff0c;所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…