我試圖使用裝飾器來管理用戶可能訪問或不訪問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