2012-11-01 44 views
4

假設你有多個提交一個表單:檢查其「提交」 POST按鈕按下Python的瓶

<form method="POST" action="/etc"> 
    <input name="foo" type="submit" value="Foo!"> 
    <input name="bar" type="submit" value="Bar!"> 
</form> 

在PHP按下檢查其提交按鈕很簡單,只要:

if (isset($_POST['foo'])) { return 'foo' } 
if (isset($_POST['bar'])) { return 'bar' } 

什麼是Python.Bottle等價物?

我已經試過:

if (request.POST.get('foo')): 
    return 'foo' 
if (request.POST.get('bar')): 
    return 'bar' 

但是,它返回一個KeyError異常,這意味着「富」和「酒吧」不在POST字典。

我也試過在表單中​​添加一個測試字段,並在表單提交時返回該字段中的值,並且完美地工作,因此表單正在發佈。

有一點可能很重要:表單中的提交按鈕是動態生成的。

編輯:發現一個可能的問題。我使用jQuery發佈和序列化表單數據,但顯然jQuery的序列化忽略了從輸出提交按鈕,這肯定會導致我所看到的。目前正在研究一種解決方法,但仍有任何幫助。

+0

確保瀏覽器在POST請求中包含提交按鈕名稱;使用瀏覽器中包含的開發人員工具。沒有任何關於提交按鈕,使得它非常特殊,服務器端可以檢測到它是一個提交按鈕,並且神奇地省略它,而不是「瓶子」或任何其他框架。這是*不是'瓶'特定的問題。 –

+0

任何提示/鏈接,告訴我如何做到這一點?如果可能的話使用Chrome。 – Djentleman

+0

'View'>'Developer'>'Developer Tools',選擇'Network'選項卡,過濾'Documents'(窗口底部),提交表單,選擇所做的請求('Method'列將顯示它是一個'POST')並檢查顯示的各個標籤。 –

回答

2

問題是jQuery的序列化函數忽略了提交按鈕。

我周圍有通過(在本例中submitButton)添加類所有相關的提交按鈕和(在本例中theHiddenInput)加入一個隱藏的輸入窗體,然後添加以下處理:

$('.submitButton').click(function() { 
    this.form.theHiddenInput.value = this.name; 
}); 

下面的代碼是我以前的代碼等價:

if (request.POST.get('theHiddenInput') == 'foo'): 
    return 'foo' 
if (request.POST.get('theHiddenInput') == 'bar'): 
    return 'bar' 

也許這將幫助別人的未來。

1

您可以嘗試將enctype="multipart/form-data"添加到您的表單嗎?

<form action="/etc" method="post" enctype="multipart/form-data"> 
    <input name="foo" type="submit" value="Foo!"> 
    <input name="bar" type="submit" value="Bar!"> 
</form> 

根據Bottle Documentation

BaseRequest.forms

表格值從url-encodedmultipart/form-data 編碼POSTPUT請求體解析。結果被重新調整爲 FormsDict。所有的鍵和值都是字符串。文件上傳分別存儲在files中 。

BaseRequest.POST

formsfiles組合成單個FormsDict的值。 值爲字符串(表單值)或 cgi.FieldStorage(文件上載)的實例。

+0

這不是問題,請參閱我的編輯。 – Djentleman

+0

您可以通過打印已發送到服務器的內容開始調試。嘗試在'request.forms'中打印所有的鍵和值。然後你可以看到jQuery是否正在更改密鑰等。 –