我试图使用装饰器来管理用户可能访问或不访问Web应用程序(在Google App Engine上运行)内资源的方式。请注意,我不允许用户使用他们的Google帐户登录,因此无法为app.yaml中的特定路由设置特定的访问权限。Python装饰器和类继承
我用以下资源:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
不过我还是有点糊涂了......
这里是我的代码!在以下示例中,current_user是属于RequestHandler类的@property方法。它返回存储在数据存储中的User(db.model)对象,并具有一个级别IntProperty()。
class FoobarController(RequestHandler):
# Access decorator
def requiredLevel(required_level):
def wrap(func):
def f(self, *args):
if self.current_user.level >= required_level:
func(self, *args)
else:
raise Exception('Insufficient level to access this resource')
return f
return wrap
@requiredLevel(100)
def get(self, someparameters):
#do stuff here...
@requiredLevel(200)
def post(self):
#do something else here...
但是,我的应用程序对不同类型的资源使用不同的控制器。为了使用所有的子类中的@requiredLevel装饰,我需要把它移动到父类(RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
我的想法是访问装饰中使用下面的代码的所有控制器的子类:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
我想我刚刚达到了我关于装饰器和类继承的知识限制:)。有什么想法吗 ?
为什么在类中的方法?这只会导致事情中断,而且它只会像定义类中的常规函数一样工作。除非您使用3.x,否则它可能会正常工作。 – 2010-07-31 16:46:24
装饰器是类上的方法,因为我还没有想过如何将装饰器编码为类1 /接受参数和可以访问当前类本身的方法。这是你的意思吗?主要是自学成才,我无法完全理解布鲁斯艾克尔的指导,装饰和继承。 – jbmusso 2010-07-31 16:57:57
你可以在类的外面复制粘贴该功能,它可以正常工作。这足以回答你的问题吗? – 2010-07-31 17:18:09