我试图使用装饰器来管理用户在网络应用程序(运行在Google App Engine上)中访问资源的方式。请注意,我不允许用户使用他们的Google帐户登录,因此在app.yaml中设置特定路由的特定访问权限不是一种选择。
我使用了以下资源:
- Bruce Eckel的装饰器指南
- SO:获取Python装饰器中的类2
- SO:Python装饰器和继承
- SO:获取Python装饰器中的类 然而,我仍然有点困惑...
这是我的代码!在下面的示例中,current_user是属于RequestHandler类的@property方法。它返回存储在数据存储中的User(db.model)对象,并具有一个级别IntProperty()。
然而,我的应用程序针对不同类型的资源使用不同的控制器。为了在所有子类中使用@requiredLevel修饰符,我需要将其移到父类(RequestHandler)中:
我使用了以下资源:
- Bruce Eckel的装饰器指南
- SO:获取Python装饰器中的类2
- SO:Python装饰器和继承
- SO:获取Python装饰器中的类 然而,我仍然有点困惑...
这是我的代码!在下面的示例中,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...
我觉得我已经达到了装饰器和类继承方面知识的极限 :). 你有什么想法吗?