如何在 Django 存储中将 AWS S3 对象设置为永不过期?

How to set an AWS S3 object to never expire in Django Storages?

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

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

其中Signature和AWSAccessKeyId也要填写

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

浏览 django-storages S3 Docs 时,我看到有一条针对

的规定

AWS_QUERYSTRING_EXPIRE 表示

The number of seconds that a generated URL is valid for.

因此,如果您希望 link 从现在起有效期为 5 年,您只需在此处添加相应的秒数,即 157784630

总而言之,只需在 settings.py

中添加以下内容

AWS_QUERYSTRING_EXPIRE = '157784630'

这对我来说并不是真正的好习惯,但更像是一个方便的 hack/workaround。

找到更好的解决方案,使 S3BotoStorage 中的文件 url 在 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年

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

您可以使用存储的 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'

如果您的 S3 存储桶是 public,您可以使用 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.