ValueError:不能编码不是2元组的对象

时间:2017-09-12 15:01:08

标签: python python-requests

我正在尝试将文件上传到服务器,但我收到此错误:

ValueError: cannot encode objects that are that are not 2-tuples

代码:

import requests
from StringIO import StringIO
buffer = StringIO()

url = 'http://example.com/files/'
user, password = 'ex', 'ample'

buffer.write(open(r'C:\Users\example\Desktop\code\de.txt','rb').read()) 

r = requests.post(url,  auth=(user, password), files=buffer.getvalue())

我尝试了auth=HTTPBasicAuth(user, pass),但这也无效。什么可以解决方案?

1 个答案:

答案 0 :(得分:1)

files只接受(key, value)元组的字典或序列。为您的文件字段命名:

r = requests.post(url,  auth=(user, password), files={'file': buffer.getvalue()})

究竟什么名称取决于您要发布的API。这会将数据编码为multipart/form-data编码的POST正文。请参阅requests快速入门文档的POST a Multipart-Encoded file section

如果您需要将文件数据作为正文中的唯一数据发布,请使用data关键字参数:

r = requests.post(url,  auth=(user, password), data=buffer.getvalue()})

我不确定你为什么使用StringIO缓冲区; requests可以直接处理文件句柄 ,而无需事先将所有内容都读入内存。即使你这样做,你也可以直接传递open(....).read()结果,而无需先通过内存缓冲区;这就是矫枉过正。

我只是打开文件,然后requests读取并为我们传输该文件:

with open(r'C:\Users\example\Desktop\code\de.txt','rb') as filedata:
    r = requests.post(url,  auth=(user, password), files={'file': filedata})