V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vJianZhen
V2EX  ›  Django

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

  •  
  •   vJianZhen · 2015-05-06 19:54:10 +08:00 · 5944 次点击
    这是一个创建于 3519 天前的主题,其中的信息可能已经有所发展或是发生改变。

    来自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.”
    为什么会两次提交数据?

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

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

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

    浏览器保存你上一次请求的request,F5就是重新发送。。。。
    mfaner
        9
    mfaner  
       2015-05-06 22:10:13 +08:00   ❤️ 1
    riaqn
        10
    riaqn  
       2015-05-06 23:00:25 +08:00
    @vJianZhen 幂等就是一个操作执行多遍 效果和执行一遍一样.
    vJianZhen
        11
    vJianZhen  
    OP
       2015-05-06 23:19:12 +08:00 via iPad
    @riaqn 受教了,谢谢!
    vJianZhen
        12
    vJianZhen  
    OP
       2015-05-06 23:20:12 +08:00 via iPad
    @wy315700 恍然大悟!
    wurenzhidi
        13
    wurenzhidi  
       2018-10-08 15:19:41 +08:00
    好棒!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3140 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:49 · PVG 20:49 · LAX 04:49 · JFK 07:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.