ユーザーが Web アプリケーション (Google App Engine で実行されている) 内のリソースにアクセスする方法とアクセスしない方法を管理するために、デコレータを使用しようとしています。ユーザーが Google アカウントでログインすることを許可していないため、app.yaml 内の特定のルートに特定のアクセス権を設定することはできません。
私は次のリソースを使用しました:
- Bruce Eckel のデコレータのガイド
- SO : get
- class
- in-python - decorator2
しかし、私はまだ少し混乱しています...
これが私のコードです!次の例では、 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...
デコレータとクラス継承に関する私の知識の限界に達したと思います:)。何かご意見は ?