【问题标题】:Django S3 uploaded file urls show credentialsDjango S3 上传的文件 url 显示凭据
【发布时间】:2015-06-30 11:47:01
【问题描述】:

我正在使用 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,但我不需要也不想以这种格式保存它们,因为所有文件都可以公开访问,也不需要凭据。 附言。我虽然使用 post_save 钩子,但它对我来说似乎是一个 hack。

【问题讨论】:

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


    【解决方案1】:

    要删除查询字符串中的身份验证凭据,请在您的 settings.py 中设置 AWS_QUERYSTRING_AUTH = False。来自django-storageshttps://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html 的文档:

    AWS_QUERYSTRING_AUTH(可选;默认为True

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

    【讨论】:

      【解决方案2】:

      您在X-Amz-Credentials 中看到的是您的访问密钥。在亚马逊环境中,它不被视为敏感信息,因此可以以纯文本形式存储。

      【讨论】:

      • 但是没有参数,图像链接的工作方式完全相同,所以我根本不想存储它们,或者将它们作为对查询的响应发送。为了清楚/简单起见,即使没有其他区别。
      【解决方案3】:

      如果您在settings.py 中设置AWS_S3_CUSTOM_DOMAIN, django-storages 将返回没有查询字符串的自定义域

      您可以参考下面的 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,
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 2016-07-12
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多