我尝试使用请求模块将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请求和请求请求之间有什么不同,导致一个失败,另一个要经历?
答案 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'))