python AWS boto3 создать предопределенный URL для загрузки файла - PullRequest
1 голос
/ 28 апреля 2020

Я пишу 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, предлагаемых здесь : enter image description here

прокрутка вниз для «загрузки» ... enter image description here

Нет метода upload_file! Я попробовал тот же код, используя «list_buckets», и он работал отлично, давая мне заранее назначенный URL-адрес, в котором перечислены сегменты под учетными данными подписавшего.

Так что без метода upload_file, доступного в функции generate_presigned_url, как я могу добиться своего Желаемая функциональность?

Спасибо!

1 Ответ

1 голос
/ 28 апреля 2020

Вы должны быть в состоянии использовать метод put_object здесь. Это чистый клиентский объект, а не мета-клиентский объект, такой как upload_file. По этой причине upload_file не появляется в client._PY_TO_OP_NAME. Эти две функции принимают разные входные данные, что может потребовать небольшого рефакторинга в вашем коде.

put_object: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3 .Client.put_object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...