在表单提交中使用Urllib替代action

0 投票
1 回答
834 浏览
提问于 2025-04-17 01:10

我需要让用户能够直接把内容上传到亚马逊的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请求后,但在重定向到亚马逊之前,把这两个变量传递给模板。

有人建议我使用urllib来实现这个功能。我尝试了以下的方法,但总是遇到一个难以理解的HTTP错误。这是我目前的代码:

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 个回答

1

我建议你使用Firebug来观察表单的工作情况,记得把它设置到网络(Net)标签。

完成POST请求后,点击它的[+]图标展开,查看头部(Headers)、POST和响应(Response)标签,看看你缺少了什么或者做错了什么。

接下来,把这个脚本从Django中分离出来,放到一个独立的文件里。每次只添加一件事,然后重新测试,直到它正常工作。下面的代码可以帮助你更好地理解你的脚本。

import httplib
httplib.HTTPConnection.debuglevel = 1

我自己尝试用urllib,但因为我没有AWS的账号,所以只得到了一个400错误请求的响应。这看起来是个好兆头,可能我只需要有效的主机和密钥参数等。

撰写回答