2015-04-24 37 views
2

我試圖將表單數據發佈到URL。我沒有得到預期的響應,並對來自請求模塊(2.6.2)的一些信息感到好奇。以下是POST方法:Python請求模塊不使用post方法

>>> response = requests.post(url, data={'uname':user, 'pwd':password,'phrase':'','submit':True}) 

正如你可以看到我使用的方法post(),所以我預期的方法是POST。對象data的鍵匹配表單元素的名稱。網址是表單操作。

>>> vars(response.request) 
{'method': 'GET', 'body': None, '_cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, 'headers': {'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Connection': 'keep-alive'}, 'hooks': {'response': []}, 'url': url} 

response.request屬性應包含有關在此響應發送的請求信息。這是method財產是GET,我預計POST。該URL看起來正確。該頁面預計會返回別的東西,如果表單帖子雖然,奇怪,我會檢查請求標題。

>>> response.request.headers 
{'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Connection': 'keep-alive'} 
>>> 

那些看起來不錯,等一下!我的表單數據在哪裏?爲什麼它沒有與請求一起發送?我查看歷史記錄,發現我正在重定向。這次我加allow_redirects=False給我的post()電話。然後檢查response.request對象及其標題。

>>> vars(response.request) 
{'method': 'POST', 'body': 'phrase=&pwd=****&uname=****&submit=True', '_cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, 'headers': {'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Content-Length': '56', 'Accept': '*/*', 'Connection': 'keep-alive'}, 'hooks': {'response': []}, 'url': 'http://myurl.com/path/to/script.php'} 

這一次這是一個POST,這似乎是正確的。我感覺我正走在正確的軌道上。奇怪的是,body屬性看起來像一個查詢字符串,不像我期望的表單帖子。

>>> response.request.headers 
{'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Content-Length': '56', 'Accept': '*/*', 'Connection': 'keep-alive'} 

這些標題,在標題中也沒有表單數據。這是什麼? 'Content-Type': 'application/x-www-form-urlencoded'?這就是爲什麼我的表單數據看起來像查詢字符串?普通的內容類型是什麼?它與Chrome瀏覽器打出相同網址的報告類型相同,因此我懷疑這是問題所在。

如果這看起來都不對,他們可能會很聰明,並拒絕從非本地來源的權利?我主要關心的是表單數據是body屬性中的一個字符串,這似乎是錯誤的。如果沒有,我可以變得聰明,並設置HTTP頭源?

+0

我試着用'。員額(頭= { '原點':..., '主機':...,...})欺騙頭'並沒有什麼區別。 – ToothlessRebel

回答

2
'application/x-www-form-urlencoded' 

這是發佈您的數據時的default content-type

是的,如果您的POST數據看起來像查詢字符串,這是確定的,這是它與x-www-form-urlencoded發送。從上一個鏈接:

控件名稱/值按它們在文檔中出現的順序列出。該名稱與=的值分隔,名稱/值對由&彼此分隔。

下一頁:

這些報頭,再在頭

與後沒有表格數據,表格數據未在標頭中發送。它在請求的正文中發送。嘗試

>>> response.request.body 
'uname=x&pwd=y&submit=True&phrase=' 

查看此數據

+0

好像你在說一切都看起來正確。也許我的問題是,結果是在會話cookie中保存我正在尋找的內容。我試着用'session = requests.session()'作爲前置'post()'來捕獲這些。您會建議更新問題以確定如何檢索這些會話Cookie嗎? – ToothlessRebel

+0

當服務器希望客戶端保存cookie時,服務器將使用HTTP Header'Set-Cookie'做出響應。您可以使用'response.headers ['set-cookie']' –

+0

來捕獲這個cookie數據。那麼,其他地方肯定會發生一些事情,因爲我得到的響應是302重定向。如果憑據被接受,它將是一個不同的頁面,但它將我返回到表單URL。我期望'set-cookie'標題並沒有得到它。我也沒有收到關於不正確憑據的預期消息,所以它不能接受我的發佈數據。我感謝你的回答,並認爲它解決了我的問題,儘管我仍然陷於一個未知的問題。 – ToothlessRebel