2015-10-17 35 views
0

我節省了使用數據存儲中的一個字段:GAE競爭條件獲得()和。把()

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,其空值或以前的值。

我該怎麼做才能獲得正確的價值?

回答

1

您將看到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,那麼您可以避免它。

+0

如果我有ID,那麼我不需要使用電子郵件比較,對不對? ID在模型中應該是唯一的。 – iamkhush

+0

沒錯,如果你有這個ID,那麼你可以構造一個密鑰,並使用get。或者你可以使用get_by_id(我忘記了db語法),它在封面下做同樣的事情。重點是,如果你通過key/id而不是通過查詢得到用戶,那麼你將得到一個一致的實體。 – Jay