如何将实际文件的卷曲帖子翻译成python请求?

时间:2014-01-23 15:25:36

标签: python post curl python-requests asana

我已经彻底搜索了stackoverflow,但我无法找到这个问题的答案。

我正在尝试为体式API python wrapper做出贡献。想法是将文件作为任务的附件发布。

在体式API docs中,指定上传的文件"需要是实际文件,而不是字节流。"

我有一个像这样的卷曲请求:

curl -u <api_key>: --form "file=@file.txt" https://app.asana.com/api/1.0/tasks/1337/attachments

它的工作正常。

我现在打算用request完成整个事情。在请求文档中,他们所讨论的是&#34;上传多部分编码文件&#34;。

所以这是我的实际问题:

  1. &#34;上传多部分编码文件&#34;与文件冲突&#34;需要是一个实际的文件,而不是一个字节流&#34;?

  2. 如何正确地将工作卷曲转换为请求帖子?

  3. 我的去处是

    request.post('https://app.asana.com/api/1.0/tasks/task_id/attachments', auth=(<api_key>, ""), data={'file': open('valid_path_to_file.ext', 'rb')})
    

    运行时,我得到了

    {"errors":[{"message":"file: File is not an object"}]}
    
    来自体式的

2 个答案:

答案 0 :(得分:2)

您可以将files参数传递给requests.post以进行表单编码文件上传。见下面的例子:

import requests

KEY = ''
TASK_ID = ''
url = 'https://app.asana.com/api/1.0/tasks/{0}/attachments'.format(TASK_ID)

with open('file.txt') as f:
    files = {'file': f.read()}
    r = requests.post(url, auth=(KEY, ''), files=files)

print(r.status_code)
print(r.json())

答案 1 :(得分:0)

这可能完全相同,但您是否尝试在请求网站上分配data参数之外的files参数:

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests