在重定向之前等待数据存储更改

Wait for datastore changes before redirecting

this question非常相似,只是答案不是suitable。

我从数据存储查询中填充 table,然后有一个 link 允许用户删除特定行。单击 link 转到 url,从数据存储中删除行,然后重定向回 table。

更改通常不会显示在 table 中,直到再次重新加载。

简单的解决方案是重定向到另一个页面,该页面使用 javascript 重定向来增加几秒钟的延迟。另一种方法是将详细信息发送回页面,例如 action=delete&key=###,然后确保 table 中遗漏了该项目。但这很痛苦。

答案与祖先查询有关。 https://cloud.google.com/appengine/docs/python/datastore/queries#Python_Ancestor_queries

创建具有父实体的实体。当其中一个实体被删除时,您可以 运行 对您的 table 列表视图进行祖先查询,这将在数据更改时具有很强的一致性。

祖先查询示例:

tom = Person(key_name='Tom')

photo_query = Photo.all()
photo_query.ancestor(tom)

对于数据存储,除非您可以使用祖先,否则您无法保证何时更新索引,只能通过执行不带异步的放置来保证实体本身(稍后通过键获取)。最好结合您的建议,其中客户端考虑其修补 ui 的操作,加上可能使用 memcache 记住最近的操作并在返回客户端之前修补查询服务器端。

这是一种不同的方法。使用 Javascript 和 AJAX。当用户点击 link 时,您会做两件事:

  1. 使用 Javascript/jQuery 从 DOM 中删除行,并且
  2. 向服务器发送 AJAX 调用以进行适当的数据存储修改。

它提供了良好的用户体验,因为您根本不需要重新加载页面。

您可能需要考虑在 table 中始终有显示过时信息的空间:例如,同时在 2 个不同的 windows/tabs 中显示 table,然后在其中一个中显示他们执行了删除,另一个仍将显示删除 link,如果跟进将导致 404。

考虑到这一点,我会首先关注管理期望(用户应该知道页面可能偶尔会显示过时的信息),然后关注用户同步获取过时页面的能力(刷新按钮?) .这 可能 使问题没有实际意义。

基于延迟的 "solutions" 在竞争条件场景中迟早会失败,我不会为额外的复杂性而烦恼。特别是对于完成删除的文档:这正是用户 知道 信息已过时(免费)并且可能倾向于刷新的地方,直到最近的更改变得可见。