【问题标题】:How to be able to avoid a browser refreshing a page, after a HTTP POST request has been sent in Python/CGI在 Python/CGI 中发送 HTTP POST 请求后,如何避免浏览器刷新页面
【发布时间】:2011-07-14 17:11:47
【问题描述】:

我正在用 python 2.5 编写一个 CGI 脚本,但遇到了一个我无法解决的问题。

我的 cgi 脚本允许用户将数据输入到 html 表单中,然后按刷新并成功添加数据。但事实证明,如果用户按下浏览器上的刷新按钮,他们之前输入的数据会再次添加。这不是我正在寻找的行为,因此我希望能够在 HTTP POST/GET 请求后将用户重定向回主页。

这当然是可能的,通过使用:

print "Location: www.website.here"

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

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

所以我的问题是是否有任何其他可能的方法来删除使用 CGI 和 python 刷新 html 页面的选项,或者我是否认为这一切都错了,我是否应该尝试找到一种方法来存储我的消息HTML 重定向?

【问题讨论】:

标签: python html redirect cgi


【解决方案1】:

我假设您实际上有两种情况:

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

我想你只能在数据验证时发出重定向,而在其他情况下显示错误消息。

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

【讨论】:

  • 哦,忘了更新这个问题... Helgi,这是我采用的方法,如果数据有效,我会重定向页面,否则我重绘页面,并显示相应的错误信息。不幸的是,目前没有从 CGI 升级到现代框架的选项。
【解决方案2】:

执行此操作的常用方法是将给定用户的待处理消息存储在服务器上,与该用户的会话相关联,并在您下次向该用户提供页面时显示它们。

此类消息通常称为“Flash 消息”(与 Adob​​e Flash 无关)或“会话消息”。

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

【讨论】:

    【解决方案3】:

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

    如果您不积极防范重复输入,则没有什么可以保护您免受重复输入(用户总是可以点击重新加载)。一种方法是为您的表单提供一些唯一编号,然后检查您是否已经接受了该编号的提交。

    您面临的另一个问题与 HTTP 本身一样古老:会话状态。如果您不想从会话 ID 或 cookie 开始,但需要通过某些页面携带数据,请始终将所有状态添加到 URL。

    新方法是使用 AJAX,您的提交按钮将不再以传统方式提交,而是将执行一些 JavaScript,在其中您在不同的(逻辑)连接上提交,等待结果,然后 更改仍然存在的 HTML 页面中的某些内容,以便用户可以看到结果(例如,在显眼的位置添加一个段落),但表单仍然在他面前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2022-11-11
      • 2013-05-27
      • 2023-01-26
      • 2015-04-26
      • 2019-02-06
      • 2011-06-15
      相关资源
      最近更新 更多