如何确保在App Engine中返回响应时反映更新?

时间:2014-03-20 21:20:24

标签: google-app-engine google-cloud-datastore

我在Google App Engine上运行Django。我做了一个类似于书店的简单应用程序。在我提交编辑图书标题的表单后,我的应用会将我重定向到所有图书的列表。

我注意到在我编辑了一本书的标题之后,我被重定向到的书籍列表没有立即反映我的更新。刷新页面后,更新会反映在列表中。我怀疑这是因为数据存储在更新事务之前获取了Book实体的版本以保持强一致性。

如何确保在提交表单后将用户重定向到包含更新书名的图书清单?我只能根据我的应用程序中更新的Book对象返回一个HTTP响应(因此放弃从数据存储中获取该书),但随后,URL将不会从表单页面中更改。

3 个答案:

答案 0 :(得分:1)

一个非常不优雅的解决方案是引入延迟以使App Engine有时间提交写入。

更好的方法可能是在Memcache中存储书籍对象。在数据存储区中更新它之前,请在Memcache中更新它。下一个请求将在Memcache中找到它,因此它不必从数据存储区中获取它。

答案 1 :(得分:1)

它无法处理所有情况,但是将新创建/编辑的实体的密钥与您的请求一起传递将允许您对该实体进行获取,并使用get&替换查询中的过期版本#39; d版本,这将是最新的。

(请注意,在SDK中,仅仅执行get就足以确保后续查询将返回当前数据 - 这不是 它在真实数据存储区中的工作方式。)

答案 2 :(得分:1)

将您的实体放入entity group for consistency;如果您进行祖先查询,则可以保证一致的结果。问题在于它将该组中的写入次数限制为每秒5次左右。你可以在每个“商店”或其他东西上拥有一个实体组。

另一种选择是:实体数据立即更新;这只是索引错误,所以如果你要显示一个书籍列表,你总是可以查询书籍密钥(仅),然后按键获取这些书籍并显示那些数据,而不是查询对于直接从索引中删除的书籍。当然,在这种情况下,排序和过滤器可能不同意实际显示的信息,因此您必须自己修复或容忍一些奇怪。