我正在使用django-storage(内部使用Boto3)上传图片。我成功地能够这样做,我得到的返回URL是这种格式:
https://.s3.amazonaws.com/foo.jpg?Signature=&AWSAccessKeyId=&Expires=1513089114
其中也填写了Signature和AWSAccessKeyId。
现在,我需要将此URL直接提供给移动开发者,我不能设置这么晚的超时。我需要它多年或可能始终可访问。这样做的好方法是什么?解决方案是什么
答案 0 :(得分:3)
在浏览django-storages S3 Docs时,我看到有一个
的规定 AWS_QUERYSTRING_EXPIRE
陈述
生成的网址有效的秒数。
因此,如果您希望该链接从现在开始有效5年,您只需在此处添加相应的秒数,即 157784630
总而言之,只需在settings.py
AWS_QUERYSTRING_EXPIRE = '157784630'
这对我来说似乎不是一个好习惯,但更像是一个方便的黑客/解决方法。
答案 1 :(得分:2)
如果您的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.
答案 2 :(得分:1)
接受的答案几乎我想要的。我不想在应用程序范围内设置它,但仅限于特定文件。如果你像我一样,请继续阅读...
您可以使用具有可选expire
kwargs的存储url()
method来生成特定文件字段的到期日期:
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'
答案 3 :(得分:0)
找到更好的解决方案,在S3BotoStorage
Django
中提供10年内FileField
个文件的网址。在 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年。