我正在尝试在flask中定义一个装饰器,它最终会装饰传递该类实例参数的类方法。这是我真正想要做的一个例子。
from functools import wraps
def user_permission(myname):
def decorator(f):
@wraps(f)
def decorated(*args,**argws):
if myname == 'My Name':
return f(*args,**argws)
else:
return "Not Permitted"
return decorated
return decorator
我的经理课程定义为:
class Manager(flask.views.MethodView):
def __init__(self,name):
self.name = name
@user_permission(self.my_name)
def post(self):
return "Response"
def get(self):
return "Response"
我要做的是将类变量传递给装饰器。是的“自我”没有定义,但“@ decorator.user_permission( self.my_name )”是我实际尝试的,因为我还没有解决我的问题。
我找不到HERE的解决方案。 有人知道这些东西吗?
答案 0 :(得分:6)
正如您所说,此时未定义self
。这可能永远不会起作用,因为在定义类时会执行装饰器,而在调用实例方法时需要运行某些装饰。
但是我觉得你真的太复杂了。 self
传递给方法本身。所以没有理由尝试将它作为装饰器的参数,因为装饰器可以访问方法参数。这会简单得多:
from functools import wraps
def user_permission():
@wraps(f)
def decorated(self, *args, **kwargs):
if self.myname == 'My Name':
return f(self, *args, **kwargs)
else:
return "Not Permitted"
return decorated
答案 1 :(得分:2)
self
只是一个论点。你不需要装饰工厂。
def user_permission(f):
@wraps(f)
def decorated(self, *args, **kw):
if self.myname == 'My Name':
return f(self, *args, **kw)
else:
return "Not Permitted"
return decorated