我在GAE中使用webapp2,当我将self.redirect调用到如下所示的某个页面时:
self.redirect(some_url)
返回一个页面看起来像缓存,我必须刷新/重新加载页面,以便我得到最新的数据。
webapp2有缓存设置吗?或者我必须为该页面的响应设置一些属性?请指教。
答案 0 :(得分:6)
在我的项目中,我通过在time.sleep(0.1)
电话之前添加self.redirect('someurl')
来解决此问题。
不确定这是否是解决问题的最佳方法,但页面开始显示最新信息。
查看@Lindsay个答案。使用time.sleep(0.1)
可能会在本地环境中为您提供预期结果,但您无法在生产环境中信任它。如果您确实需要结果强烈一致,请使用祖先查询,而不是time.sleep(0.1)
。
答案 1 :(得分:5)
我的猜测是发生了这种情况,因为前面的页面正在更新一个实体,然后通过非祖先查询在后一页面上访问该实体。非祖先查询提供最终一致性而不是强一致性,因此问题不在于页面未被刷新,而是在更新完成之前显示数据的样子。当您刷新或添加对time.sleep()的调用时,您可能会为数据存储提供足够的时间来赶上,尤其是在测试期间。但是,在生产中,在所有情况下,您的睡眠时间可能不够长,页面刷新也是如此。
如果您检查应用程序并发现您使用的是非祖先查询,因此您的问题确实是最终一致性与强一致性,Google搜索会向您显示许多网页讨论该主题;这是一个:https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore#ftnt_ref1。
最简单的解决方案似乎是创建一个实体组并使用祖先查询,但这会带来可能的性能损失以及每个实体组每秒更新一次的限制。
答案 2 :(得分:1)
遇到同样的问题我做了一个不好的伎俩,但无论如何帮助了我。称为临时视图文件,然后执行html重定向:
<meta http-equiv="refresh" content="0.5;URL='/'">
希望它有所帮助。任何一个有更好答案的人?
答案 3 :(得分:0)
您是否在return
之后立即致电self.redirect(some_url)
?它可能会落到呈现页面的其他代码中。