Python请求 - 从文件中POST数据

24

我曾使用curl发送包含文件数据的POST请求。

现在我想使用Python的requests模块来实现相同的功能。以下是我的Python脚本:

import requests
payload=open('data','rb').read()
r = requests.post('https://IP_ADDRESS/rest/rest/2', auth=('userid', 'password'), data=payload , verify=False)
print r.text

数据文件如下所示

'ID' : 'ISM03'

但是我的脚本没有从文件中POST数据。我错过了什么吗?

在Curl中,我曾经有一个命令如下:

Curl --data @filename -ik -X POST 'https://IP_ADDRESS/rest/rest/2' 
1个回答

51
你不需要在这里使用.read(),直接流传对象即可。您确实需要显式设置Content-Type标头; 当使用--data时,curl会执行此操作,但requests不会:
with open('data','rb') as payload:
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    r = requests.post('https://IP_ADDRESS/rest/rest/2', auth=('userid', 'password'),
                      data=payload, verify=False, headers=headers)

我使用了打开文件对象作为上下文管理器,这样当块退出时(例如发生异常或 requests.post()成功返回),它也会自动关闭。


11
你总是能回答最难的Python问题,这是怎么做到的? - Games Brainiac
4
不要相信我发布的所有内容...第一版修订中有错误。 - Martijn Pieters
@MartijnPieters 谢谢您的回复。我仍然无法从文件中POST数据。如果我直接在脚本中使用值,它可以工作。例如:payload={ 'ID' : 'ISM03' }。但是当我将内容放入文件中并按照您提到的方式使用时,我无法更新。我需要更改输入文件的格式吗? - skanagasabap
2
curl 期望数据文件已经被正确编码,requests 同样如此。我假设您希望将其作为原样发布,就像 curl --data @filename 所做的那样。 - Martijn Pieters
2
@khrf:它不会关闭它。已更新为使用文件对象作为上下文管理器,以确保其关闭。 - Martijn Pieters
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接