在帖子表单中使用Urllib而不是操作

时间:2011-09-02 00:08:20

标签: python amazon-s3 urllib2

我需要允许用户将内容直接上传到Amazon S3。此表单有效:

<form action="https://me.s3.amazonaws.com/" method="post" enctype='multipart/form-data' class="upload-form">{% csrf_token %}
    <input type="hidden" name="key" value="videos/test.jpg">
    <input type="hidden" name="AWSAccessKeyId" value="<access_key>"> 
    <input type="hidden" name="acl" value="public-read">
    <input type="hidden" name="policy" value="{{policy}}">
    <input type="hidden" name="signature" value="{{signature}}">
    <input type="hidden" name="Content-Type" value="image/jpeg">
    <input type="submit" value="Upload" name="upload">
</form>

在函数中,我定义了策略和签名。但是,我需要将两个变量传递给表单 - Content-TypeKey,只有在用户按下上传按钮时才会知道。因此,我需要在POST请求之后但在重定向到Amazon之前将这两个变量传递给模板。

有人建议我使用urllib来做到这一点。我尝试过以下方式,但我不断得到一个难以理解的HTTPError。这就是我目前所拥有的:

if request.method == 'POST':
    # define the variables
    urllib2.urlopen("https://me.amazonaws.com/", 
                           urllib.urlencode([('key','videos/test3.jpg'),  
                           ('AWSAccessKeyId','<access_key'), 
                           ('acl','public-read'), 
                           ('policy',policy),
                           ('signature',signature),
                           ('Content-Type',content_type),
                           ('file',file)]))

我也尝试过硬编码所有值而不是使用变量但仍然得到相同的错误。我做错了什么,我需要更改什么才能将表单重定向到亚马逊,所以内容可以直接上传到亚马逊?

1 个答案:

答案 0 :(得分:1)

我建议观看表单与Firebug一起使用,启用并设置为“网络”标签。

完成POST后,单击其[+]图标展开,研究标题,POST,响应标签,看看你缺少什么和/或做错了。

接下来将此脚本与Django分开并放入一个独立的文件中。一次添加一件东西并重新测试直到它工作。下面的行应该可以提高脚本的可见性。

import httplib
httplib.HTTPConnection.debuglevel = 1

我自己尝试使用urllib,但由于我在AWS上没有帐户,因此我得到的不仅仅是获得400 Bad Request响应。似乎是一个好兆头,可能我只需要有效的主机和关键参数等。