【问题标题】:django-storages and amazon s3 - suspiciousoperationdjango-storages 和 amazon s3 - 可疑操作
【发布时间】:2012-09-21 17:15:01
【问题描述】:

我将 django-storages 与 Amazon S3 一起使用。我间歇性地看到以下错误:

name = self._normalize_name(self._clean_name(name))\n\n  File \"/app/.heroku/venv/lib/python2.7/site-packages/storages/backends/s3boto.py\", line 237, in _normalize_name\n    name)\n\nSuspiciousOperation: Attempted access to 'https:/plantvillage.s3.amazonaws.com/avatar/hans9_avatar.jpg'

注意https: 之后的单个/

有人知道为什么会这样吗?它不会一直发生。在其他情况下,我可以成功地做到这一点。

【问题讨论】:

    标签: django amazon-s3 python-django-storages


    【解决方案1】:

    _normalize_name 在带有 URL 的 Django 东西上做了很多花哨的东西,而且大多是不必要的。就我而言,我只是像这样覆盖 S3BotoStorage

    class S3CustomStorage(S3BotoStorage):
    def _normalize_name(self, name):
        """
        Get rid of this crap: http://stackoverflow.com/questions/12535123/django-storages-and-amazon-s3-suspiciousoperation
        """
        return name
    

    然后在存储属性中使用:

    ImageField(storage=S3CustomStorage())
    

    它适用于具有此基本配置的 django simple ImageField:

    AWS_ACCESS_KEY_ID = 'TTTT'
    AWS_SECRET_ACCESS_KEY = 'XXXX'
    AWS_STORAGE_BUCKET_NAME = 'ZZZZ'
    

    【讨论】:

      【解决方案2】:

      当您使用 default_storage 方法时,请确保使用 file.name:

      正确:

      default_storage.delete(file.name)
      

      错误:

      default_storage.delete(file.url)
      

      错误:

      default_storage.delete(file)
      

      以上三个示例都适用于本地文件,但在使用 s3 时,除非使用 file.name,否则会遇到此错误。

      【讨论】:

      • file.url 的处理方式与 file.name 不同。我也这样做了,但它似乎更像是一个 hack,而不是一个实际的解决方案。除了这个方法不会引发异常之外,是否有任何来源表明这确实是正确的?
      • 我不知道。
      【解决方案3】:

      我还没有在我自己的项目中使用 S3 存储,但我确实遇到了这个错误,也许可以为您指明正确的方向。

      如果您查看 S3BotoStorage._clean_name(),它只是:return os.path.normpath(name).replace('\\', '/')。 os.path.normpath() 将 URL 中的 // 转换为 \\,然后 .replace() 将其转换为 \。然后,S3BotoStorage._normalize_name() 检查以确保这个损坏的 URL 是它所代表的位置的一部分,当然不是。这就是引发 SuspiciousOperation 错误的地方。

      所以“名称”看起来像是一个本地路径,而不是整个 AWS URL。在我的情况下,直接原因是 settings.py 中的FILEBROWSER_DIRECTORY = MEDIA_URL + "uploads/",我曾试图修复有关丢失上传文件夹的不同错误。

      【讨论】:

        【解决方案4】:

        设置

        MEDIA_ROOT=''
        

        帮我解决了这个问题。

        【讨论】:

          【解决方案5】:

          我修复了这个问题,在 except: 上添加了 SuspiciousOperation:

          class S3CustomStorage(S3BotoStorage):
              def _normalize_name(self, name):
                  try:
                      return safe_join(self.location, name)
                  except (SuspiciousOperation, ValueError):
                      return ""
          

          【讨论】:

            猜你喜欢
            • 2014-10-16
            • 2012-05-06
            • 1970-01-01
            • 2015-06-05
            • 1970-01-01
            • 2014-09-15
            • 2018-02-22
            • 2014-06-30
            • 1970-01-01
            相关资源
            最近更新 更多