为什么处理完 POST 数据后应该重定向? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vJianZhen
V2EX    Django

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

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

    来自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     Solana     2365 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:36 PVG 19:36 LAX 03:36 JFK 06:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86