【问题标题】:How to set an AWS S3 object to never expire in Django Storages?如何在 Django 存储中将 AWS S3 对象设置为永不过期?
【发布时间】:2023-04-01 11:55:01
【问题描述】:

我正在使用django-storage(内部使用 Boto3)上传图片。我成功地这样做了,我得到的返回 URL 是这种格式:

https://.s3.amazonaws.com/foo.jpg?Signature=&AWSAccessKeyId=&Expires=1513089114

其中 Signature 和 AWSAccessKeyId 也填写。

现在,我需要将此 URL 直接提供给移动开发人员,而且我不能这么晚才设置超时。我需要它很多年,或者可能总是可以访问。这样做的好方法是什么?解决办法是什么

【问题讨论】:

  • 什么 Boto3 API 返回签名 URL?上传后生成网址吗?
  • 是的,它是返回的 URL
  • 您是否完整阅读了我的问题?
  • 哦,对了,我在内部使用 Boto3 的 Python 中使用 django-storages。 django-storages.readthedocs.io/en/latest/backends/amazon-S3.html
  • 您不应该将已签名的 URL 硬编码到应用程序中……或任何您无法轻松更新的内容。该 URL 不仅最终会过期(并且不能未过期),而且当您停用或轮换您的 AWSAccessKeyId 时(如您定期应该这样做,当然如果您的秘密被泄露,则需要)任何由该 URL 签名的 URL密钥立即失效。 揭示一个签名的 URL 并没有什么不安全的地方,但是运送一个依赖它无限期保持有效的产品将是一个严重的错误。

标签: amazon-s3 timeout boto3 django-storage


【解决方案1】:

浏览 django-storages S3 Docs 时,我看到有

AWS_QUERYSTRING_EXPIRE 哪些状态

生成的 URL 有效的秒数。

因此,如果您希望链接从现在起 5 年内有效,您可以在此处添加相应的秒数,即 157784630

总之,只需在您的settings.py 中添加以下内容

AWS_QUERYSTRING_EXPIRE = '157784630'

这对我来说似乎并不是一个好的做法,但更像是一种方便的破解/解决方法。

【讨论】:

  • 这行不通。 AWS 签名 URL 的最长生命周期为 7 天 (see this question)。仅仅因为您可以在 django-storages 中将其设置为 5 年,并不意味着 AWS 会兑现它。
【解决方案2】:

找到更好的解决方案,使S3BotoStorage 中的文件网址在Django FileField 中可用10 年。在 settings.py 中:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' ...

解决办法是:

from django.core.files.storage import default_storage
from myapp.models import MyModel

myobj = MyModel.objects.first()
key = default_storage.bucket.new_key(myobj.file_field.name)
url = key.generate_url(expires_in=60*60*24*365*10)

url 有效期为 10 年。

【讨论】:

  • 即使 AWS S3 有 7 天的限制,这真的有效吗?
【解决方案3】:

接受的答案几乎达到了我想要的。我不想在应用程序范围内设置它,而只是在特定文件上。如果你和我一样,请继续阅读......

您可以使用存储的url() method 生成特定文件字段的到期时间,该url() method 具有可选的expire kwargs:

post = Post.objects.first()
post.image.storage.url(post.image.name, expire=60*60*24*365)

这样做的缺点是它与 Django 的默认存储 API 不兼容,这会在本地引发 TypeError

TypeError: url() got an unexpected keyword argument 'expire'

【讨论】:

  • 非常感谢您节省了我的时间!正是我想要的:)
【解决方案4】:

如果您的 S3 存储桶是公开的,您可以使用this setting 关闭查询参数身份验证。

Setting AWS_QUERYSTRING_AUTH to False to remove query parameter authentication
from generated URLs. This can be useful if your S3 buckets are public.

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2012-06-28
    • 2012-08-14
    • 1970-01-01
    • 2020-05-19
    • 2018-06-19
    • 2011-03-18
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多