<p>您可以传入一个<code>dict</code>、<em>或</em>两个值元组的序列。在</p>
<p>并且<code>OrderedDict</code>被简单地转换成这样一个序列:</p>
<pre><code>r = requests.post("https://instructure-uploads.s3.amazonaws.com/", files=payload.items())
</code></pre>
<p>但是,由于<code>collections.OrderedDict()</code>类型是<code>dict</code>的子类,调用<code>items()</code>实际上是<code>requests</code>在幕后的作用,所以直接传递<code>OrderedDict</code>实例也同样有效。在</p>
<p>因此,有些事情是错误的。您可以通过发布到<code>http://httpbin/post</code>来验证正在发布的内容:</p>
^{pr2}$
<p>不幸的是,<code>httpbin.org</code>没有保持顺序。或者,您也可以在<a href="http://requestb.in/" rel="nofollow">http://requestb.in/</a>创建一个专用的httppostbin;它将更详细地告诉您发生了什么。在</p>
<p>使用请求B.in,通过将<code>'@log.txt'</code>替换为打开的文件对象,POST from请求被记录为:</p>
<pre><code>POST /tlrsd2tl HTTP/1.1
User-Agent: python-requests/1.1.0 CPython/2.7.3 Darwin/11.4.2
Host: requestb.in
Content-Type: multipart/form-data; boundary=7b12bf345d0744b6b7e66c7890214311
Content-Length: 1601
Connection: close
Accept-Encoding: gzip, deflate, compress
Accept: */*
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="content-type"; filename="content-type"
Content-Type: application/octet-stream
text/plain
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="success_action_redirect"; filename="success_action_redirect"
Content-Type: application/octet-stream
https://ian.test.instructure.com/api/v1/files/30652543/create_success?uuid=<opaque_string>
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="Signature"; filename="Signature"
Content-Type: application/octet-stream
<opaque_string>
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="Filename"; filename="Filename"
Content-Type: application/octet-stream
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="acl"; filename="acl"
Content-Type: application/octet-stream
private
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="Policy"; filename="Policy"
Content-Type: application/octet-stream
<opaque_string>
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="key"; filename="key"
Content-Type: application/octet-stream
account_95298/attachments/30652543/log.txt
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="AWSAccessKeyId"; filename="AWSAccessKeyId"
Content-Type: application/octet-stream
<opaque_string>
7b12bf345d0744b6b7e66c7890214311
Content-Disposition: form-data; name="file"; filename="log.txt"
Content-Type: text/plain
some
data
7b12bf345d0744b6b7e66c7890214311
</code></pre>
<p>显示顺序正确保留。在</p>
<p>请注意,<code>requests</code>不支持特定于Curl的<code>@filename</code>语法;而是传入一个open file对象:</p>
<pre><code> 'file': open('log.txt', 'rb')
</code></pre>
<p>您可能还想设置<code>content-type</code>字段以使用标题大小写:<code>'Content-Type': ..</code>。在</p>
<p>如果您仍然得到500个响应,请检查<code>r.text</code>响应文本,看看Amazon认为什么是错误的。在</p>