9

我将 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:

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

4

5 回答 5

4

_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'
于 2015-03-17T14:21:29.750 回答
2

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

正确的:

default_storage.delete(file.name)

错误的:

default_storage.delete(file.url)

错误的:

default_storage.delete(file)

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

于 2013-04-15T20:05:41.387 回答
1

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

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

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

于 2012-09-22T14:22:11.623 回答
0

环境

MEDIA_ROOT=''

为我解决了这个问题。

于 2013-05-04T18:09:10.877 回答
-1

我解决了这个问题,在除了:

class S3CustomStorage(S3BotoStorage):
    def _normalize_name(self, name):
        try:
            return safe_join(self.location, name)
        except (SuspiciousOperation, ValueError):
            return ""
于 2016-11-24T10:58:33.423 回答