2011-07-14 38 views
0

我在Python 2.5中編寫CGI腳本,遇到了一個我無法解決的問題。如何在Python/CGI發送HTTP POST請求後避免瀏覽器刷新頁面

我的cgi腳本允許用戶將數據轉換爲html表單,然後按刷新併成功添加數據。但事實證明,如果用戶按下瀏覽器上的刷新按鈕,他們之前輸入的數據會再次被添加。這不是我正在尋找的行爲,因此我希望能夠在HTTP POST/GET請求返回主頁面後重定向用戶。

這當然是可能的自然,通過使用:

print "Location: www.website.here" 

在python線。但我不能這樣做,因爲我需要能夠在每次刷新之間存儲消息,以便能夠向用戶顯示信息。

這些消息本質上是驗證錯誤消息,如果用戶輸入錯誤的數據並按提交,那麼我的頁面應該重新加載並打印錯誤消息。我有這方面的工作,但如果我需要重定向使用上述線,然後我放鬆了這一點。

所以我的問題是有沒有其他可能的方式來刪除使用CGI和python刷新html頁面的選項,或者我看着這一切都錯了,我應該試圖找到一種方法來存儲我的消息後一個HTML重定向?

+1

看看這個[維基百科文章](http://en.wikipedia.org/wiki/Post/Redirect/Get),然後重寫你的問題,如果仍然需要 –

回答

1

我想你實際上有兩種情況:

  1. 用戶正確輸入的數據;重新加載頁面會導致添加的數據再次被添加(這是錯誤的);用戶可能會被重定向到開始頁面。
  2. 用戶沒有正確輸入數據(有錯誤信息);重新加載會導致再次顯示相同的消息;重定向不可接受。

我想只有在數據有效的情況下才能發出重定向,並在其他情況下顯示錯誤消息。

如果您可以選擇將CGI腳本遷移到Flask,Bottle,Django或Pyramid等現代Web框架,我建議您這樣做。這會給你會話狀態和一般更方便和現代化的環境。

+0

哦,忘了更新這個問題... Helgi,這是我承擔的方法,因爲如果數據是有效的,我重定向頁面,否則我會重畫頁面,並顯示相應的錯誤消息。 不幸的是,目前無法從CGI升級到現代框架。 –

0

執行此操作的常用方法是將特定用戶的待處理消息存儲在與該用戶會話關聯的服務器上,並在下次向該用戶提供頁面時顯示它們。

此類消息通常稱爲「Flash消息」(與Adobe Flash無關)或「會話消息」。

請參閱the Django documentation瞭解如何在Django中執行此操作。

0

你的問題非常混亂,因爲你說「新聞刷新」添加數據。 - 您也不會提及您的表單是通過POST還是GET(是否已提交?)提交。

如果您沒有主動對抗他們,沒有什麼能夠保護您免受重複輸入(用戶可以隨時點擊重新加載)。一種方法是用一些唯一的號碼發送您的表格,並檢查您是否已接受該號碼的提交。

而你面對的另一個問題與HTTP本身一樣古老:會話狀態。如果您不想從會話ID或Cookie開始,但需要通過某些頁面傳輸數據,請始終將所有狀態添加到URL中。

新方法是使用AJAX,在那裏你的提交按鈕不會經常提交,而是要執行一些你在不同的(邏輯)連接上提交的JavaScript,等待結果並且比改變仍然存在的HTML頁面中的內容,以便用戶可以看到結果(例如,在顯眼的位置添加段落),但仍然保持原樣。