使用Python请求库上载大型XML文件

2024-04-20 07:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用Python&;请求库替换curl。使用curl,我可以使用curl-T选项将单个XML文件上载到REST服务器。我无法对请求库执行同样的操作。

一个基本的场景:

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文件将负载更改为更大的字符串时,.put方法将挂起(我使用编解码器库来获取正确的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("*", "*"))

我一直在研究使用multipart选项(文件),但服务器似乎不喜欢这样。

所以我想知道是否有方法在Python请求库中模拟curl-T行为。

更新1: 程序挂起在textmate中,但在命令行上引发UnicodeEncodeError错误。看来这就是问题所在。所以问题是:有没有办法将unicode字符串发送到带有请求库的服务器?

更新2: 多亏了马蒂金·皮特斯的评论,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

似乎服务器总是跳转第一次身份验证尝试(?)但接着接受第二个。

当文件对象(open('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

所以,第一次尝试和以前一样被阻止,但没有第二次尝试。

根据Martijn Pieters(见下文)的说法,第二个问题可以用故障服务器(空行)来解释。 我会调查的,但如果有人有一个解决办法(除了使用卷曲),我不会介意听到它。

我仍然感到惊讶的是,请求库对于小字符串和文件对象的行为如此不同。文件对象在到达服务器之前不是已经序列化了吗?


Tags: 文件字符串test服务器httpputexamplexml