我使用django-storages
和Amazon S3进行文件存储。在我的模型中,我有:
avatar = models.ImageField(_('Avatar'), upload_to='avatars/profiles/', blank=True, null=True)
图片已在save
上成功上传,但保存了包含凭据的完整网址。在我的检索请求/当我通过控制台从db读取url时,我得到类似的东西:
https://subdomain.amazonaws.com/avatars/profiles/filename.jpg?X-Amz-Algorithm=XXX&X-Amz-Expires=XXX&X-Amz-SignedHeaders=XXXX&X-Amz-Signature=XXXX&X-Amz-Date=XXXXXX&X-Amz-Credential=XXXX
我该怎样防止这种情况?我可以在响应之前删除URL,但我不需要因此不希望以这种格式保存它们,因为所有文件都可以公开访问,也不需要凭据。
PS。我虽然使用post_save
钩子,但它对我来说似乎是一个黑客。
答案 0 :(得分:0)
您在X-Amz-Credentials
中看到的是您的访问密钥。在Amazon环境中,它不被视为敏感信息,因此可以以纯文本格式存储。
答案 1 :(得分:0)
如果您在AWS_S3_CUSTOM_DOMAIN
中设置settings.py
,
django-storages将返回不带查询字符串的custom-doamin
您可以参考下面的S3BotoStorage类代码
def url(self, name, headers=None, response_headers=None, expire=None):
# Preserve the trailing slash after normalizing the path.
name = self._normalize_name(self._clean_name(name))
if self.custom_domain:
return "%s//%s/%s" % (self.url_protocol,
self.custom_domain, filepath_to_uri(name))
if expire is None:
expire = self.querystring_expire
return self.connection.generate_url(
expire,
method='GET',
bucket=self.bucket.name,
key=self._encode_name(name),
headers=headers,
query_auth=self.querystring_auth,
force_http=not self.secure_urls,
response_headers=response_headers,
)
答案 2 :(得分:0)
要删除查询字符串中的身份验证凭据,请在AWS_QUERYSTRING_AUTH = False
中设置settings.py
。来自https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html的django-storages
文档:
AWS_QUERYSTRING_AUTH
(可选;默认为True
)将
AWS_QUERYSTRING_AUTH
设置为False
,以从生成的URL中删除查询参数身份验证。如果您的S3存储桶是公共的,这将很有用。