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

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

 

posted @ 2017-05-18 11:13  然语  阅读(1601)  评论(0编辑  收藏  举报