Я пытаюсь загрузить файл с s3 на клиент через django. Для этого я сгенерировал публичный URL-адрес из необходимого объекта s3, и я пытаюсь перенаправить пользователя на этот URL-адрес, поэтому файл загружается на его / ее компьютер. Код следующий
def generate_public_url(self, bucket, file)
url = ''
filename = file
client = boto3.client(
's3',
)
url = client.generate_presigned_url(
ClientMethod ='get_object',
ExpiresIn = 7200,
Params = {
'Bucket': bucket,
'Key': file,
}
)
return url
Код, который перенаправляет URL:
from .django.http import HttpResponseRedirect
.
.
.
http_response_redirect = HttpResponseRedirect(url)
return http_response_redirect
А ответ от aws - 403 со следующей ошибкой:
Код: Подпись DoesNotMatch
Сообщение: рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.
Проведя некоторое исследование в течение нескольких дней и попробовав много вещей, я уверен, что это проблема с django, и после прочтения некоторого поста в github люди говорят, что если заголовки включают в себя что-то другое, сравните с теми, которые использовались для генерации публичный URL может генерировать эту ошибку. Итак, что-то в django способе сделать запрос должно быть другим, но я не знаю, что может быть.
Кроме того, использование URL-адреса непосредственно в браузере позволяет загружать файл, также используя POSTMAN, а также делать это на колбе, работает отлично, перенаправления применяются, и файл загружается.
То же самое относится и к django, наверняка к заголовкам. Это http-снимки с использованием wireshark из django и flask.
DJANGO
GET /table_video/descarga/?csrfmiddlewaretoken=%7B%7B+csrf_token+%7D%7D
HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type: application/json
Referer: http://127.0.0.1:8000/table_video/
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: csrftoken=j0VucAJTbmoYNhabs5HSY1qLnj3KSstGrga35y1lrn1zvIX5XhGyjLTcbvc347I6; sessionid=n5wmcy27utko9uwj53brb62jhy4i4gv8
HTTP/1.1 302 Found
Date: Mon, 17 Jun 2019 13:53:04 GMT
Server: WSGIServer/0.2 CPython/3.7.3
Content-Type: text/html; charset=utf-8
Location: https://django-static-videos.s3.amazonaws.com/test_file.txt?AWSAccessKeyId=***************&Signature=w9a2G0J8puFpwPtRIzEXYL0XF0Y%3D&Expires=1560786784
Content-Length: 0
ФЛЯГА
GET / HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: csrftoken=j0VucAJTbmoYNhabs5HSY1qLnj3KSstGrga35y1lrn1zvIX5XhGyjLTcbvc347I6; sessionid=n5wmcy27utko9uwj53brb62jhy4i4gv8
HTTP/1.0 302 FOUND
Content-Type: text/html; charset=utf-8
Content-Length: 533
Location: https://django-static-videos.s3.amazonaws.com/test_file.txt?AWSAccessKeyId=***************&Signature=RIOzX36RfPkHmhGl4STBYTADzdI%3D&Expires=1560784567
Server: Werkzeug/0.15.4 Python/3.7.3
Date: Mon, 17 Jun 2019 13:55:30 GMT
Есть ли что-то в запросе, которое отличается, что приводит к сбою запроса от django на сервере AWS? Может быть, порядок заголовков запроса может привести к сбою? Если да, то есть ли в Python библиотека для непосредственного создания http-запроса вместо использования django?
Спасибо