如何避免在Python/CGI中发送HTTP POST请求后浏览器刷新页面
我正在用Python 2.5写一个CGI脚本,但遇到了一个解决不了的问题。
我的CGI脚本允许用户在一个HTML表单中输入数据,然后按刷新,数据就会成功添加。但是,如果用户在浏览器上按了刷新按钮,之前输入的数据又会被添加一次。这不是我想要的行为,所以我希望在用户提交数据后,能够把他们重定向回主页面。
其实,这个是可以做到的,只需要在Python中使用:
print "Location: www.website.here"
这一行代码。但我不能这样做,因为我需要在每次刷新之间存储一些信息,以便能向用户显示相关内容。
这些信息主要是验证错误信息。如果用户输入了错误的数据并按了提交,我的页面应该重新加载并显示错误信息。我这部分已经实现了,但如果我使用上面那行代码进行重定向,就会失去这些信息。
所以我的问题是,有没有其他方法可以在使用CGI和Python时去掉刷新HTML页面的选项,或者我是不是想错了,应该寻找一种在HTML重定向后存储信息的方法?
3 个回答
一种常见的方法是把某个用户未处理的消息存储在服务器上,这些消息和用户的会话相关联,下次给这个用户发送页面时就可以显示这些消息。
这些消息通常被称为“闪存消息”(和Adobe Flash没有关系)或者“会话消息”。
想了解在Django中如何实现这个,可以参考Django的文档。
你的问题让人很困惑,因为你说“按下刷新”会增加数据。你也没有说明你的表单是通过POST还是GET提交的(到底有没有提交呢?)。
如果你不主动防止,用户可以随时点击刷新,这样就会出现重复提交的情况。一个解决办法是给你的表单加一个独特的编号,然后检查这个编号的提交是否已经被接受过。
你面临的另一个问题和HTTP一样古老,那就是会话状态。如果你不想使用会话ID或Cookies,但又需要在多个页面间传递数据,可以把所有状态信息都加到URL里。
现在的新方法是使用AJAX,这样你的提交按钮就不再是传统的提交方式,而是会执行一些JavaScript代码,通过一个不同的(逻辑上的)连接来提交数据,等待结果后再在仍然存在的HTML页面中做一些改变,让用户看到结果(比如在显眼的位置添加一段文字),同时表单仍然在用户面前。
我想你可能有两种情况:
- 用户输入的数据是正确的;如果重新加载页面,之前添加的数据会再次被添加(这是不对的);用户可能会被重定向到首页。
- 用户输入的数据不正确(会有错误提示);重新加载页面会再次显示相同的错误信息;重定向是不合适的。
我觉得只有在数据验证通过的情况下,才可以进行重定向,而在其他情况下则应该显示错误信息。
如果你有机会把你的CGI脚本迁移到像Flask、Bottle、Django或Pyramid这样的现代网页框架,我建议你这样做。这会让你拥有会话状态,并且提供一个更方便、更现代的环境。