Django S3上传文件网址显示凭据

时间:2015-06-30 11:47:02

标签: python django url amazon-web-services amazon-s3

我使用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钩子,但它对我来说似乎是一个黑客。

3 个答案:

答案 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.htmldjango-storages文档:

  

AWS_QUERYSTRING_AUTH(可选;默认为True

     

AWS_QUERYSTRING_AUTH设置为False,以从生成的URL中删除查询参数身份验证。如果您的S3存储桶是公共的,这将很有用。