我使用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:
没有人知道为什么会这样显示出来? 它不发生的事情。 我可以成功地做到这一点在其他情况下。
_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'
当您使用default_storage方法确保使用的file.name:
正确:
default_storage.delete(file.name)
错误:
default_storage.delete(file.url)
错误:
default_storage.delete(file)
所有三个例子以上本地文件的工作,但使用S3时,你会遇到这样的错误,除非您使用file.name。
我还没有得到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中,我曾试图希望能解决有关缺失上传文件夹不同的错误。
我解决了这个问题,对,只是加入SuspiciousOperation:
class S3CustomStorage(S3BotoStorage):
def _normalize_name(self, name):
try:
return safe_join(self.location, name)
except (SuspiciousOperation, ValueError):
return ""