你好,我正在使用Django应用程序,并将我的媒体文件保存在AWS S3存储桶中,并在我的应用程序中显示,这很好,但我需要生成一个图像URL来放入我使用Django boto3的邮箱中

获取URL的代码如下:

import boto3
from decouple import config

AWS_ACCESS_KEY_ID = config("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = config("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = 'wiini'
AWS_S3_REGION_NAME = 'ca-central-1'
AWS_S3_SIGNATURE_NAME = 's3v4'
AWS_S3_FILE_OVERWRITE = False


def get_s3_favicon_url():
    s3_client = boto3.client(
        's3',
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        region_name=AWS_S3_REGION_NAME,
        config=boto3.session.Config(signature_version=AWS_S3_SIGNATURE_NAME)
    )

    favicon_key = 'favicon-32x32.png'

    url = s3_client.generate_presigned_url(
        'get_object',
        Params={'Bucket': AWS_STORAGE_BUCKET_NAME, 'Key': favicon_key},
        ExpiresIn=3600,  # Set an appropriate expiration time in seconds
        HttpMethod='GET',  # Specify the HTTP method
    )

    print("Generated URL:", url)
    return url

但当我点击生成的URL时,我会看到:

<Code>AuthorizationQueryParametersError</Code>

组件错误在此:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AuthorizationQueryParametersError</Code>
<Message>Query-string authentication version 4 requires the X-Amz-算法rithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.</Message>
<RequestId>MBZZHKZF2ZJEGNJ2</RequestId>
<HostId>1u9Jg6UQWPsdbmN2Qh88HYhsVNILR3CY58RzIMu3Be6FALR6D8qu+GnLEND/Mwee4Mkx0p7zoR8=</HostId>
</Error>

有人能帮我解决这个问题吗?

推荐答案

您的示例签名URL缺少许多URL参数,这些参数必须存在才能正常工作.

一个例子应该类似于https://wiini.s3.amazonaws.com/favicon-32x32.png?X-Amz-算法rithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA.....%2F20240104%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240104T132824Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=b4533.....a663

我的猜测是,print("Generated URL:", url)会打印出正确的URL,并且在get_s3_favicon_url返回后会被截断.

Django相关问答推荐

Django的update_or_create失败,尽管指定了kwargs'

其中实际的数据库提取在DRF list()中完成

升级到4.2时,获取默认文件存储/存储是互斥的

创建用户/将用户登录到客户端服务器的标准OAuth/OIDC流程是什么?

无法使用 django-filters 进行过滤

只从查询集中获取某种类型的最新项目

来自 Django 应用程序的日志(log)消息未上传到 AWS CloudWatch

DeleteView 中的success_message 未显示

Django 视图 - 首先从调用应用程序的目录加载模板

Django - 如何在其管理模块中访问模型的详细名称?

测试 Django ModelForm 是否有实例

手动触发 Django 邮件错误报告

如何使用 select_for_update 在 Django 中获取查询?

如何使用 django 发送 POST 请求?

始终将用户包含在 django 模板上下文中

Django 删除未使用的媒体文件

获取 Django 表单中的错误列表

如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?

如何使用基于类的视图处理表单(通过 get 或 post)?

django.urls.path中name参数的作用是什么?