2

我有两个模拟用户 Jo 和 Sam,他们的 ID 分别为 117138609372751079516 和 144229817858159123282。

该应用程序具有以下实体:

class MockEntity(ndb.Model):
    ownerId = ndb.StringProperty(default=users.get_current_user().user_id())

当两者同时登录并且任何一个用户第一次保存/放置实体时,属性“ownerId”将随机填充用户 ID:117138609372751079516144229817858159123282

使用 pre_put_hook 似乎可以解决问题:

def _pre_put_hook(self):
    if not self.ownerId:
        self.ownerId = users.get_current_user().user_id()

我已经解决了眼前的问题,但为什么会这样呢?这已经在开发和生产中与一组大约 50 名测试人员进行了测试。大约 40% 的人可以看到不属于他们的实体。

4

1 回答 1

5

该问题可能是由于ownerId仅在MockEntity一次为每个 App Engine 运行时实例创建类时设置的默认值。因此,当新的 App Engine 实例加载时,默认值由第一个用户设置,以将类加载到 Python 解释器中。

有关 NDB 中相同情况的解释,请参阅Gotcha — Python 中此经典问题的可变默认参数和App Engine NDB Gotcha PickleProperty Default Value

于 2013-03-26T23:42:35.650 回答