Использование Urllib вместо действия в форме сообщения - PullRequest
0 голосов
/ 02 сентября 2011

Мне нужно разрешить пользователям загружать контент напрямую в 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-Type и Key, которые будут известны только тогда, когда пользователь нажмет кнопку загрузки. Таким образом, мне нужно передать эти две переменные в шаблон после запроса 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)]))

Я также пытался жестко закодировать все значения вместо использования переменных, но все равно получаю ту же ошибку. Что я делаю неправильно и что мне нужно изменить, чтобы иметь возможность перенаправить форму в Amazon, чтобы контент можно было загружать непосредственно в Amazon?

1 Ответ

1 голос
/ 02 сентября 2011

Я рекомендую, чтобы форма работала с Firebug , включенным и установленным на вкладку Сеть.

После завершения процедуры POST щелкните значок [+], чтобы развернуть его, изучитеВкладки Заголовки, POST, Ответ, чтобы увидеть, что вы упускаете и / или делаете неправильно.

Затем отделите этот скрипт от Django и поместите в отдельный файл.Добавляйте одну вещь за раз и повторяйте тестирование, пока оно не заработает.Строки ниже должны улучшить видимость вашего скрипта.

import httplib
httplib.HTTPConnection.debuglevel = 1

Я попытался сам покопаться в urllib, но, поскольку у меня нет аккаунта в AWS, я не получил дальше, чем получение 400 Bad Requestответ.Похоже, хороший знак, возможно, мне просто нужны действительные параметры хоста и ключа и т. Д.

...