GAE 竞争条件 .get() 和 .put()

GAE Race condition .get() and .put()

我正在使用以下方法保存数据存储中的字段之一:

self.user.expiration_date = datetime.datetime.utcnow() + datetime.timedelta(days=31)
self.user.put()

我正在使用 Webapp2。保存用户到期日期后,我将用户重定向到一个方法,其中编写了以下代码。

user = User.all().filter('email =', self.session.get('email'))

digest = self.session.get('passwd').encode('utf-8', 'ignore')
user = user.filter('passwd =', digest).get()
self.user = user

然而,在此之后,当我检查 expiration_date 时,它的 Null 或以前的值。

我应该怎么做才能得到正确的值?

您正在看到 NoSQL 数据存储中最终一致性的影响。本节解释发生了什么。 https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.w3kz4fze562t

基本上,写入实体与查询看到这些写入之间存在轻微延迟。如果通过键重新获取实体,就可以避免这个问题。

如果您可以用 User.get_by_id() 调用替换 User.all() 查询,然后比较 user.email == session.get('email') and user.password == digest 那么您就可以避免它。