<p>有了<code>requests</code>,我相信你不必那么手工,只要:</p>
<pre><code>import requests
# ...
url = self._resolve_url('/a/creative/uploadcreative')
files = {'file': ('userfile', open(filepath, 'rb'))}
data = {'account_id': account_id}
headers = {'content-type': 'multipart/form-data'}
res = requests.post(url, files=files, data=data, headers=headers)
return res.json
</code></pre>
<p>我想你担心的是:</p>
<pre><code>parts.append('Content-Type: %s' % mimetypes.guess_type(file_path)[0] or 'application/octet-stream')
</code></pre>
<p>毫无疑问,我还没有向自己证明这一点。但是,我认为这是内置的请求<a href="https://github.com/kennethreitz/requests/blob/develop/requests/packages/urllib3/filepost.py#L26" rel="noreferrer">here</a>。</p>
<p>Edit:It<a href="https://github.com/kennethreitz/requests/blob/develop/requests/packages/urllib3/filepost.py#L42" rel="noreferrer">looks like</a>您可以在dict文件中使用普通字段,正如您所建议的那样:</p>
<pre><code>files = {'file': open('image.jpg', 'rb'), 'account_id': 12345}
</code></pre>
<p>并可以根据需要命名文件名:</p>
<pre><code>files = {'file': ('userfile', open('image.jpg', 'rb')), 'account_id': 12345}
</code></pre>
<p>但是,您将在<code>account_id</code>字段上得到一个<code>body.write(b'Content-Type: text/plain\r\n\r\n')</code>,这可能不是您想要的,并且没有办法为每个字段定制内容配置(仍然不确定为什么您需要这样做);对于文件和字段,您将得到:<code>Content-Disposition: form-data</code>-这是您为这两个字段显示的内容。</p>
<p>我不确定您是否可以使用<code>requests</code>做您想要的事情,也许您应该尝试一个功能请求。</p>