我有一個在App Engine上運行的Web服務器,它使用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 > }
這個錯誤讓我懷疑self
在grant()
函數是以某種方式 作用像一個全局值,因爲它正在積累以前呼叫的數據,即使在不同實例上執行這些呼叫時也是如此。
問題是:爲什麼我的模型在它們之間泄漏數據? 是self
在裝飾器的上下文中,與類方法的上下文中的self
相同?