如何在 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.
我正在使用 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.