为什么处理完 POST 数据后应该重定向?

2015-05-06 19:54:10 +08:00
 vJianZhen

来自Django官方教程的话:
“you should always return an HttpResponseRedirect after successfully dealing with POST data. This tip isn’t specific to Django; it’s just good Web development practice.”

为什么呢?

“This prevents data from being posted twice if a user hits the Back button.”
为什么会两次提交数据?

5906 次点击
所在节点    Django
13 条回复
wy315700
2015-05-06 20:05:25 +08:00
防止刷新页面的时候重复提交
cloudzhou
2015-05-06 20:06:54 +08:00
当你 POST 数据之后,浏览器保留了这次 http 请求,之后在你的 F5 或者 返回 时,浏览器重新执行了这一次请求,在一些关键的行为,比如支付,重复 POST 可能导致不好的后果。
所以推荐 POST 之后做一个重定向。

这种方法其实也不能避免用户的重复点击行为,可能因为网络状况或者误操作,所以一般有如下做法:
1 点击 submit 之后失去焦点,不能再次点击,前台控制。
2 每次 POST 带有一个唯一性的 token,后台发现这个 token 已经被处理,不再执行这次请求,后台控制。
endoffight
2015-05-06 20:14:46 +08:00
其根本原因是POST方法的非幂等
vJianZhen
2015-05-06 21:06:50 +08:00
@endoffight 非幂等 是什么?
vJianZhen
2015-05-06 21:10:21 +08:00
@cloudzhou 说得不错!
深究进去,浏览器保留了 http 请求时,在 F5 或者 返回 时为嘛会再次执行请求?。。。
wy315700
2015-05-06 21:11:29 +08:00
@vJianZhen

不然你以为F5是什么意思
vJianZhen
2015-05-06 21:58:29 +08:00
@wy315700 F5是刷新啊。可是为什么刷新就会重新提交?
wy315700
2015-05-06 22:03:16 +08:00
@vJianZhen F5是重新发起请求。

浏览器保存你上一次请求的request,F5就是重新发送。。。。
mfaner
2015-05-06 22:10:13 +08:00
riaqn
2015-05-06 23:00:25 +08:00
@vJianZhen 幂等就是一个操作执行多遍 效果和执行一遍一样.
vJianZhen
2015-05-06 23:19:12 +08:00
@riaqn 受教了,谢谢!
vJianZhen
2015-05-06 23:20:12 +08:00
@wy315700 恍然大悟!
wurenzhidi
2018-10-08 15:19:41 +08:00
好棒!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/189000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX