我有两个模拟用户Jo和Sam以及各自的ID 117138609372751079516和144229817858159123282。
该应用具有以下实体:
class MockEntity(ndb.Model):
ownerId = ndb.StringProperty(default=users.get_current_user().user_id())
当两者同时登录并且用户第一次保存/放置实体时,属性'ownerId'随机填充 的用户ID:117138609372751079516或144229817858159123282
使用pre_put_hook似乎解决了这个问题:
def _pre_put_hook(self):
if not self.ownerId:
self.ownerId = users.get_current_user().user_id()
我已经解决了我的直接问题,但为什么一开始就是这种情况发生的?这已经在开发和生产中进行了测试,由约50名测试人员组成。大约40%的人可以看到不属于他们的实体。
答案 0 :(得分:5)
问题可能是由于ownerId
的默认值仅设置为每个App Engine运行时实例创建类MockEntity
的第一时间。因此,当新的App Engine实例加载时,第一个用户将设置默认值以将类加载到Python解释器中。
有关Python中的此经典问题,请参阅Gotcha — Mutable default arguments,有关NDB中相同情况的说明,请参阅App Engine NDB Gotcha PickleProperty Default Value。