Python装饰器实现几类验证功能做法(续)
:昨天聊了一下构造。今天试了一下。感觉昨天聊的还是不够细化。今天结合代码实现,加以一点补充。
首先观察下面这个例子
from functools import wraps def decorator(f):
@wraps(f)
def decorated_function(object_id,*args, **kwargs):
print(object_id)
return f(object_id,*args, **kwargs)
return decorated_function @decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id) test('bbbb','aaa')

这个例子的目的是为了处理test的形参。假如已经知道test具有一个object_id属性。希望在装饰器中进行验证。那么按照上述写法
得到的结果和预期结果不符。因为实际上这个地方形参没有按照名称进行参数传递。而是只是按照顺序取了第一个输入的参数'bbbb'作为输出
那么接下来,根据python的尿性,我感觉只要在输入的时候指定一下输入参数对应的形参类型,这个问题就能解决了。于是:
from functools import wraps def decorator(f):
@wraps(f)
def decorated_function(object_id,sys_id,*args, **kwargs):
print(object_id)
return f(object_id,sys_id,*args, **kwargs)
return decorated_function @decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id) test(sys_id='aaa',object_id='bbbb')

显然这样调整以后,达到了我们需要的效果。此外,测试了一下改动(装饰器以及目标函数)形式参数的顺序,结果不会发生变化
(但是注意:return f(object_id,sys_id,*args, **kwargs)的内容,这里没有将形参和实参绑定,因此可见装饰器实际上修改了传递参数的顺序。所以要注意代码规范,善用变化)
这个地方成功将参数和传递进入的形参进行了绑定。这样的话,我们就可以成功在以下这种动态路由写法的时候验证传递给目标函数的地址,
当前用户是否具有访问权限了

但这样还不够,当URL中带有get请求的参数的时候,就不能用传递的形参来进行处理了。因为get请求不会把参数放在函数的形参里面。而是作为get方法的返回值
那么接下来测试一下:
装饰器代码如下:
def test(f):
@wraps(f)
def decorated_function(*args, **kwargs):
sys_id = request.args.get('sys_id')
print("sys_id is ",sys_id)
object_id = request.args.get('object_id')
print("object_id is ",object_id)
return f(*args, **kwargs)
return decorated_function
绑定该装饰器的函数如下:

输出结果:

那么,通过尝试得到了这样一些信息:装饰器参数规则保持和目标函数一致时,可以完全继承该路由的规则,只要在设置验证类函数的时候,已知验证项的名称,就能直接使用
这个名称进行验证。如果这个名称是动态生成的,那么使用globals()进行动态构建,应该也能满足这个要求。
不过这样的编程方式,我感觉还是不太理想。后面找时间再优化看看。
Python装饰器实现几类验证功能做法(续)的更多相关文章
- Python装饰器实现几类验证功能做法
最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器.比如下面这种 de ...
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- 装饰器实现session登陆 验证功能
装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...
- python 装饰器,传递类以及参数
#!/usr/bin/env python # coding=utf- import time #import redis class RedisLock(object): def __init__( ...
- python 装饰器 第二步:扩展函数的功能(不修改原函数)
# 第二步:扩展函数的功能(不能修改原函数) # 用于扩展基本函数的函数 # 把一个函数(eat函数)作为一个整体传给另外一个函数(kuozhan函数) # 这个函数(kuozhan函数)用形参fun ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- Python装饰器实现类Java注解功能
最近想用Python写一个简单生成器,类似指定类型和范围,返回指定列表: 比如想要 0 ~ 3 的整数,则 我只需要指定: 最小:0, 最大:3, 步长:1 则返回一个 [0,1,2,3] 的列表 ...
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
随机推荐
- Mybatis 中一对多,多对一的配置
现在有很多电商平台,就拿这个来说吧.顾客跟订单的关系,一个顾客可以有多张订单,但是一个订单只能对应一个顾客. 一对多的顾客 <?xml version="1.0" encod ...
- 数据库习题(oracle)
学生表 Student 字段值分别是 Sid ,Sname ,Sage ,Ssex 教师表 Teacher 字段值分别是 Tid ,Tname 课程表 Course 字段值分别是Cid ,Cname ...
- C语言函数不定参数实现方式
函数如何实现不定参数: 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. (1)va_ ...
- less学习笔记(二)
1.作用域:基本与javascrip的作用域相似,即先找局部变量,后找全局变量.找变量时遵循就近原则. 2.条件表达式:.mixin (@a) when (lightness(@a) >= 50 ...
- web前端概念巩固(一)
h5: 1.web语义化 Web语义化是指在进行HTML结构.表现.行为设计时,尽量使用语义化的标签,使程序代码简介明了,易于进行Web操作和网站SEO,方便团队协作的一种标准,以图实现一种" ...
- MySQL用户认证及权限grant-revoke
一.MySQL用户认证: 登录并不属于访问控制机制,而属于用户身份识别和认证: 1.用户名-user 2.密码-password 3.登录mysqld主机-host 实现用户登录MySQL,建立连接. ...
- Jmeter的逻辑控制器——Controller
逻辑控制器(Logic Controller) --贯穿整个Test Plan中,与各组件执行顺序没关系:目的是用于控制采样器的执行顺序. Simple Controller Simple Contr ...
- uiautomator+cucumber实现自动化测试
前提 由于公司业务要求,所以自动化测试要达到以下几点: 跨应用的测试 测试用例可读性强 测试报告可读性强 对失败的用例有截图保存并在报告中体现 基于以上几点,在对自动化测试框架选型的时候就选择了uia ...
- CVSS3.0打分学习
打分计算器: Common Vulnerability Scoring System Version 3.0 Calculator: https://www.first.org/cvss/calcul ...
- 蓝桥杯-兰顿蚂蚁-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...