:昨天聊了一下构造。今天试了一下。感受昨天聊的仍是不够细化。今天结合代码实现,加以一点补充。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')
显然这样调整之后,达到了咱们须要的效果。此外,测试了一下改动(装饰器以及目标函数)形式参数的顺序,结果不会发生变化3d
(可是注意:return f(object_id,sys_id,*args, **kwargs)的内容,这里没有将形参和实参绑定,所以可见装饰器实际上修改了传递参数的顺序。因此要注意代码规范,善用变化)代码规范
这个地方成功将参数和传递进入的形参进行了绑定。这样的话,咱们就能够成功在如下这种动态路由写法的时候验证传递给目标函数的地址,blog
当前用户是否具备访问权限了继承
但这样还不够,当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()进行动态构建,应该也能知足这个要求。
不过这样的编程方式,我感受仍是不太理想。后面找时间再优化看看。