2010-07-13 131 views
30

我想創建一個使用wx/Python的超簡單虛擬輸入/輸出板。我已經準備好了以下代碼,用於向我要存儲數據的服務器發送一個請求:Python的URLLib/URLLib2 POST

data = urllib.urlencode({'q': 'Status'}) 

u = urllib2.urlopen('http://myserver/inout-tracker', data) 

for line in u.readlines(): 
    print line 

沒有什麼特別的。我遇到的問題是,根據我如何閱讀文檔,這應該執行Post請求,因爲我提供了數據參數,而且這沒有發生。我有這樣的代碼在該網址索引:每次我跑我的Python應用程序的時間

if (!isset($_POST['q'])) { die ('No action specified'); } 

echo $_POST['q']; 

我也得到打印到我的控制檯「無指定動作」的文字。我將嘗試使用請求對象來實現它,因爲我已經看過一些包含這些演示的演示,但我想知道是否有人可以幫助我解釋爲什麼我沒有使用此代碼獲取發佈請求。謝謝!

- 編輯 -

此代碼的工作和職位,以我的網頁正確:

data = urllib.urlencode({'q': 'Status'}) 

h = httplib.HTTPConnection('myserver:8080') 

headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 

h.request('POST', '/inout-tracker/index.php', data, headers) 

r = h.getresponse() 

print r.read() 

我仍然不清楚爲什麼庫的urllib2時不我公司提供的數據參數後置 - 對我來說文檔表明它應該。

+0

你爲什麼不使用'urllib2'? – 2010-07-13 15:59:59

+3

我是。 'urllib2.urlopen'。我只使用urllib來編碼發佈數據。 – 2010-07-13 16:01:24

回答

41
u = urllib2.urlopen('http://myserver/inout-tracker', data) 
h.request('POST', '/inout-tracker/index.php', data, headers) 

使用路徑/inout-tracker末尾沒有/不取index.php。相反,服務器將發出302重定向到尾隨/的版本。

執行302通常會導致客戶端將POST轉換爲GET請求。

+7

這個答案很完美! Python 2.6 urllib2模塊在重定向時不會從POST切換到GET。這種情況不僅發生在尾部的正斜槓上,而且在http重定向到https的情況下也會發生。 – Hazok 2014-01-02 01:14:28

+2

你的'u'在那裏什麼都沒做。 – oneloop 2017-01-26 20:55:42