:昨天聊了一下构造。今天试了一下。感觉昨天聊的还是不够细化。今天结合代码实现,加以一点补充。

首先观察下面这个例子

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()进行动态构建,应该也能满足这个要求。

不过这样的编程方式,我感觉还是不太理想。后面找时间再优化看看。

最新文章

  1. Objective-C总Runtime的那点事儿(一)消息机制
  2. IIS 7.5最新解析漏洞
  3. JS常用的设计模式
  4. c++学习笔记——聚合类
  5. 【转】JavaScript顶级对象参考模型
  6. windows类书的学习心得(转载)
  7. 算法分析-插入排序INSERT_SORT与选择排序SELECT_SORT【线性方法】
  8. ZOJ 3713 In 7-bit (题意不好理解,十进制、二进制、十六进制的转换问题)
  9. ByteBuffer源码分析
  10. 小实例---关于input宽度自适应以及多个input框合并拆分
  11. Spring IOC、AOP、Transaction、MVC小结
  12. NYOJ 方案数量
  13. 新增节点NewBook并增加属性Name="WPF"
  14. GoLang学习控制语句之for
  15. ehcache、redis应用场景比较
  16. 如何自定义oauthauthorizationserverprovider错误信息?
  17. 2017 最新的 cocoaPods 安装方法
  18. PTA L2-002 链表去重 团体程序设计天梯赛-练习集
  19. POJ2449 Remmarguts' Date A*算法
  20. 使用testng.xml组织测试用例

热门文章

  1. git操作详解
  2. Mycat安装与使用
  3. String 类的实现(3)引用计数实现String类
  4. 【转】一个工具类(可以控制多层嵌套的movieClip)
  5. CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)
  6. java 解压 zip 包并删除
  7. donet体系结构
  8. java多线程基本概述(一)——线程的基本认知
  9. MySQL操作符
  10. 一款好用的jquery评分插件