将“curl -F”转换为 Python 请求

Gar*_*ong 5 python curl python-requests restheart

我正在尝试使用 python 中的“请求”进行多部分表单上传。我可以上传文件,但它永远不会加载通常通过 -F 标志与 curl 传递的其他字段。我试图模仿的 curl 命令:

curl -v -u user:password -X POST -F 'properties={"filename":"maurizio.png"}' -F "file=@maurizio.png" 192.168.59.103:8080/testdb/mybucket.files
Run Code Online (Sandbox Code Playgroud)

请求代码是:

url = "http://192.168.59.103:8080/testdb/mybucket.files"
content_type = "multipart/form-data"

params = {"filename":"maurizio.png"}
params["_id"] = "test_hash_1234" 

data = open('maurizio.png','rb').read()

files = {'file': ('maurizio.png',data,content_type,params)}               
request = requests.post(url,files=files,auth=('user','password'))
Run Code Online (Sandbox Code Playgroud)

这个文件被加载到 mongodb 的 resheart api 中。“_id”是数据库用来引用对象的特殊对象 ID。除了文件名等其他文档字段之外,我还需要指定该文档字段。该文件被上传到名为 gridfs 的 Mongo 的 blob 数据存储中。我可以使用 curl 上传数据和附加文档字段,但上面的“请求”代码只上传数据而不上传附加文档字段。我需要那些额外的字段来查询。

有人可以帮我将 -F 标志转换为相当于 python 的请求模块的东西吗?谢谢!

Dek*_*kel 2

查看手册中的示例

files = {'file': ('report.xls', open('report.xls', 'rb'))}
r = requests.post(url, files=files)
Run Code Online (Sandbox Code Playgroud)

请注意,首先您应该传递文件而不是数据(您不需要read()文件的内容,只需传递文件对象)