如何避免浏览器在Python/CGI中发送httppost请求后刷新页面

2024-04-23 22:13:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python2.5编写一个CGI脚本,遇到了一个我无法解决的问题。在

我的cgi脚本允许用户将数据输入到html表单中,然后按refresh,数据就成功地添加了。但事实证明,如果用户按下浏览器上的刷新按钮,他们之前输入的数据会再次被添加。这是一个我不能回头看的HTTP请求的主页面。在

当然,通过使用:

print "Location: www.website.here"

python中的行。但我不能这样做,因为我需要能够在每次刷新之间存储消息,以便能够向用户显示信息。在

这些消息本质上是验证错误消息,如果用户输入了错误的数据并按下了submit,那么我的页面应该重新加载并打印错误消息。我有这方面的工作,但如果我需要使用上面的行重定向,那么我会失去这个。在

所以,我的问题是,有没有其他可能的方法来删除使用CGI和python刷新html页面的选项,或者我是不是看错了,我应该在html重定向之后找到一种方法来存储我的消息?在


Tags: 数据方法用户脚本消息表单html错误
3条回答

我假设你有两种情况:

  1. 用户正确输入了数据;重新加载页面会导致添加的数据再次被添加(这是错误的);用户可能会被重定向到起始页。在
  2. 用户没有正确输入数据(有错误消息);重新加载将导致相同的消息再次显示;重定向不可接受。在

我想只有在数据验证后才能发出重定向,在另一种情况下显示错误消息。在

如果您可以选择将CGI脚本迁移到现代web框架中,比如Flask、Bottle、Django或Pyramid,我建议您这样做。这将为您提供会话状态和通常更方便和现代化的环境。在

你的问题非常令人困惑,因为你说“按刷新”会添加数据。–您也没有提到您的表格是通过POST还是GET提交的(是否提交??)。在

如果你不积极防范双重输入,就没有什么能保护你免受双重输入(用户总是可以点击重新加载)。一种方法是使用某个唯一的编号提交表格,然后检查您是否已经接受了该编号的提交。在

你所面临的另一个问题和HTTP本身一样古老:会话状态。如果您不想从会话id或cookies开始,但需要在某些页面中传输数据,请始终在URL中添加all state。在

新的方法是使用AJAX,这里的submit按钮不再是经典的提交,而是执行一些JavaScript,在这个JavaScript中,您可以在不同的(逻辑)连接上提交,等待结果,然后在仍然存在的HTML页面中更改一些内容,以便用户可以看到结果(例如,添加段落在一个突出的地方),但他的形式仍然在他面前。在

一种常见的方法是将给定用户的挂起消息存储在服务器上,与该用户的会话关联,并在下次向该用户传递页面时显示这些消息。在

这些消息通常被称为“Flash消息”(与adobeflash无关)或“会话消息”。在

请参见the Django documentation,了解如何在Django中执行此操作。在

相关问题 更多 >