私は、App Engine上で実行しているデータサーバにndb
を使用しています。デコレータ実装によるデータベースモデルのクロストーク
@acl
class MyModel(ndb.Model):
...
access_control = ndb.JsonProperty(default={})
私はいくつかのアクセス制御方法で私のモデルを強化するために@acl
デコレータを使用します。
データ・モデルは、次のようになります。 デコレータこのようなものになります。
def acl(model):
def grant(self, subject, credentials):
logging.debug("ACL before: {}".format(self.access_control))
self.access_control[subject] = { ... } # Set correct value.
logging.debug("ACL after: {}".format(self.access_control))
model.grant = grant
...
...
私のアプリケーションからは、その後、私はこのようにそれを呼び出すことを期待する:
>>> mdl = MyModel(...)
>>> mdl.grant("someone", "creds")
ACL before: {}
ACL after: { < properly populated access_control > }
をしかし、その代わりに、私はこれに似た何かを得る:
>>> mdl1 = MyModel(...)
>>> mdl1.grant("someone", "creds")
ACL before: {}
ACL after: { < properly populated access_control > }
>>> mdl2 = MyModel(...)
>>> mdl2.grant("someone else", "other creds")
ACL before: { < values from mdl1 > }
ACL after: { < values from mdl1 concatenated with mdl2 > }
を
このバグは、grant()
機能のself
が何とかグローバル値のように機能していると思わせています。これらの呼び出しが異なるインスタンスで実行されても、以前の呼び出しのデータが蓄積されているため、 です。
質問は:なぜ私のモデルはそれらの間にデータを読み込んでいますか? self
はデコレータの文脈で、クラスメソッドの文脈ではself
と同じですか?