2015-10-17 3 views
0

Я спасаю один из полей в хранилище данных с использованием:GAE Race состояние .get() и .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 или предыдущее значение.

Что мне делать, чтобы получить правильное значение?

ответ

1

Вы видите эффекты конечной согласованности в хранилище данных NoSQL. В этом разделе объясняется, что происходит. https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.w3kz4fze562t

В основном существует небольшая задержка между тем, когда объект написан и когда эти записи будут видны по запросу. Если вы вернете объект по его ключу, вы избежите этой проблемы.

Если вы можете заменить запрос User.all() на звонок User.get_by_id(), а затем сравнить user.email == session.get('email') and user.password == digest, то вы можете его избежать.

+0

Если у меня есть идентификатор, тогда мне не нужно использовать сравнение по электронной почте, верно? Идентификатор должен быть уникальным в модели. – iamkhush

+0

Правильно, если у вас есть идентификатор, вы можете создать ключ и просто использовать get. Или вы можете использовать get_by_id (я забыл синтаксис db), который делает то же самое под обложками. Дело в том, что если вы получите пользователя по ключу/id, а не по запросу, вы получите согласованный объект. – Jay

Смежные вопросы