Python的Requests模块是否将数据添加到它发布的文件中?

时间:2014-10-11 17:44:32

标签: python curl python-requests

我尝试使用请求模块将csv文件发送到将数据上传到数据库的API。由于数据将进入数据库,因此API配置为拒绝具有无法识别的列名称的文件。接受的列是" id","艺术家","视频"。我有一个只有一行数据的test.csv文件:

id,artist,video
1,The Shins,Phantom Limb

当我使用以下curl请求将文件发送到api时,它会成功通过。

curl -i -u myUser:myPassword -X POST -T .\test.csv "http://destination.com/api/endpoint/create-or-update-records"

这是卷曲响应消息:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Sat, 11 Oct 2014 14:47:51 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
Connection: close

但是,当我尝试使用请求post方法发送文件时:

url = "http://destination.com/api/endpoint/create-or-update-records"
files = {'file': open("test.csv", "rb")}
r = requests.post(url, files=files, auth=("myUser","myPassword"))

我得到的回应是:

Unknown fields: '--5a6f03307ed74747904844625f76a82e'. Valid fields are: 'id', 'artist', 'video'

如果我再次发送文件,我会得到相同的消息,但是" - lotsofcharacters"现在是一组不同的角色。

我猜测我错过了某个设置或其他内容,但我已经梳理了请求API并且无法弄清楚它是什么。 curl请求和请求请求之间有什么不同,导致一个失败,另一个要经历?

1 个答案:

答案 0 :(得分:2)

您不会通过请求向您的服务器发送纯文本。当您希望执行files上传到服务器时,文档明确声明您使用multipart/form-data参数。在这种情况下,您需要做的就是

with open('test.csv', 'rb') as csv_file:
    r = requests.post(url, data=csv_file, headers={'Content-Type': 'text/plain'}, auth=('user', 'password'))