我試圖用Python &替換curl的請求庫。使用curl,我可以使用curl -T選項將單個XML文件上載到REST服務器。我一直無法對請求庫做同樣的事情。用Python請求庫上傳一個大的XML文件
基本方案的工作原理:
payload = '<person test="10"><first>Carl</first><last>Sagan</last></person>'
headers = {'content-type': 'application/xml'}
r = requests.put(url, data=payload, headers=headers, auth=HTTPDigestAuth("*", "*"))
當我打開一個XML文件改變有效載荷更大的字符串,該方法。把掛起(我用的編解碼器庫,以獲得正確的unicode字符串)。例如,具有66KB文件:
xmlfile = codecs.open('trb-1996-219.xml', 'r', 'utf-8')
headers = {'content-type': 'application/xml'}
content = xmlfile.read()
r = requests.put(url, data=content, headers=headers, auth=HTTPDigestAuth("*", "*"))
我一直在尋找到使用多選項(文件),但服務器似乎並不喜歡這樣。
所以我想知道是否有一種方法來模擬Python請求庫中的curl -T行爲。
UPDATE 1: 程序掛在textmate中,但在命令行中引發UnicodeEncodeError錯誤。似乎一定是問題。所以問題是:有沒有辦法將unicode字符串發送到服務器與請求庫?
更新2: 感謝Martijn Pieters的評論,UnicodeEncodeError消失了,但出現了一個新問題。 隨着一個文本(ASCII)的XML字符串,日誌顯示下列行:
2012-11-11 15:55:05,154 INFO Starting new HTTP connection (1): my.ip.address
2012-11-11 15:55:05,294 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 401 211
2012-11-11 15:55:05,430 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 201 0
似乎服務器總是彈跳第一認證嘗試,但然後接受第二個(?)。
隨着文件對象(打開( 'TRB-1996-219.xml', 'RB'))傳遞到數據,日誌文件顯示:
2012-11-11 15:50:54,309 INFO Starting new HTTP connection (1): my.ip.address
2012-11-11 15:50:55,105 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 401 211
2012-11-11 15:51:25,603 WARNING Retrying (0 attempts remain) after connection broken by 'BadStatusLine("''",)': /v1/documents?uri=/example/test.xml
因此,首先嚐試如前阻擋,但沒有第二次嘗試。
根據馬亭皮特斯(下),第二個問題可以通過一個故障服務器(空行)說明。 我會研究這一點,但如果有人有一個解決方法(除了使用捲曲),我不會介意聽到它。
而我仍然感到驚訝的是,對於小字符串和文件對象,請求庫的行爲如此不同。無論如何,文件對象在到達服務器之前是否已序列化?
感謝您的快速反應。這樣做解決了UnicodeEncodeError,但引入了ConnectionError:MaxRetryError。而服務器沒有關閉,因爲我可以用curl上傳文件。 –
@M_breeb:你需要使用'logging'模塊來找出原因;由於某種原因,連接到服務器的嘗試失敗,* *之前*能夠PUT數據。 'urllib3'連接池重試連接,並且它將記錄每次連接到'logging'模塊的失敗。 –
'import logging',然後'logging.basicConfig()'是快速獲得輸出的最基本方法。 –