Django的储存和Amazon S3的 - suspiciousoperation(django

2019-07-31 19:27发布

我使用Django的储存与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:

没有人知道为什么会这样显示出来? 它不发生的事情。 我可以成功地做到这一点在其他情况下。

Answer 1:

_normalize_name做了很多花哨的,大多对Django的东西与URL不必要的。 在我来说,我只是覆盖这样的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的简单的ImageField与此基本配置:

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


Answer 2:

当您使用default_storage方法确保使用的file.name:

正确:

default_storage.delete(file.name)

错误:

default_storage.delete(file.url)

错误:

default_storage.delete(file)

所有三个例子以上本地文件的工作,但使用S3时,你会遇到这样的错误,除非您使用file.name。



Answer 3:

我还没有得到S3存储在我自己的项目工作,但我却只是碰到这种错误运行,也许能为你指明正确的方向。

如果你看一下S3BotoStorage._clean_name(),它只是: return os.path.normpath(name).replace('\\', '/') os.path.normpath()//将在转换您的网址为\\,然后.replace()转换,为\。 然后,S3BotoStorage._normalize_name()检查,以确保该URL损坏是它所代表的位置,这当然它不是的一部分。 这就是被提出的SuspiciousOperation错误的位置。

所以“名字”看起来像它的意思是本地路径,而不是整个AWS URL。 在我的情况下,直接原因是FILEBROWSER_DIRECTORY = MEDIA_URL + "uploads/" settings.py中,我曾试图希望能解决有关缺失上传文件夹不同的错误。



Answer 4:

设置

MEDIA_ROOT=''

解决了这个问题对我来说。



Answer 5:

我解决了这个问题,对,只是加入SuspiciousOperation:

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


文章来源: django-storages and amazon s3 - suspiciousoperation