Я пишу django бэкэнд для приложения, в котором клиент будет загружать видеофайл в s3. Я хочу использовать предварительно назначенные URL-адреса, поэтому сервер django подпишет URL-адрес и передаст его обратно клиенту, который затем загрузит свое видео на s3. Проблема в том, что метод generate_presigned_url, похоже, не знает о методе upload_file клиента s3 ...
Следуя этому примеру , я использую следующий код для генерации URL для загрузки:
s3_client = boto3.client('s3')
try:
s3_object_name = str(uuid4()) + file_extension
params = {
"file_name": local_filename,
"bucket": settings.VIDEO_UPLOAD_BUCKET_NAME,
"object_name": s3_object_name,
}
response = s3_client.generate_presigned_url(ClientMethod="upload_file",
Params=params,
ExpiresIn=500)
except ClientError as e:
logging.error(e)
return HttpResponse(503, reason="Could not retrieve upload url.")
При запуске я получаю сообщение об ошибке:
Файл "/Users/bridgedudley/.local/share/virtualenvs/ShoMe/lib/python3.6/site -packages / botocore / signers.py ", строка 574, в generate_presigned_url имя_операции = self._PY_TO_OP_NAME [client_method] KeyError: 'upload_file'
, которая вызывает исключение:
botocore.exceptions.UnknownClientMethodError: У клиента нет метода: upload_file
После отладки я обнаружил, что словарь self._PY_TO_OP_NAME содержит только подмножество клиентских команд s3, предлагаемых здесь :
прокрутка вниз для «загрузки» ...
Нет метода upload_file! Я попробовал тот же код, используя «list_buckets», и он работал отлично, давая мне заранее назначенный URL-адрес, в котором перечислены сегменты под учетными данными подписавшего.
Так что без метода upload_file, доступного в функции generate_presigned_url, как я могу добиться своего Желаемая функциональность?
Спасибо!