Django Amazon S3 SuspiciousOperation [英] Django amazon s3 SuspiciousOperation
问题描述
因此,当我尝试从浏览器访问S3上的某个图像时,一切正常.但是当python在做的时候我得到一个SuspiciousOperation
错误.
我的静态文件夹在S3上是公共的,所以我真的不知道它来自哪里.
So when i try accessing a certain image on S3 from my browser everything works fine. But when python is doing it i get a SuspiciousOperation
error.
My static folder is public on S3 so i really have no idea where this is coming from.
Publication.objects.get(id=4039).cover.url
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/django/db/models/fields/files.py", line 64, in _get_url
return self.storage.url(self.name)
File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/queued_storage/backends.py", line 291, in url
return self.get_storage(name).url(name)
File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/queued_storage/backends.py", line 115, in get_storage
elif cache_result is None and self.remote.exists(name):
File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/storages/backends/s3boto.py", line 410, in exists
name = self._normalize_name(self._clean_name(name))
File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/storages/backends/s3boto.py", line 341, in _normalize_name
name)
SuspiciousOperation: Attempted access to 'http:/s3-eu-west-1.amazonaws.com/xpto/static/images/default-image.png' denied.
我的设置:
AWS_S3_SECURE_URLS = True # use http instead of https
S3_URL = 'http://s3-eu-west-1.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = 'media/'
STATIC_ROOT = '/static/'
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = S3_URL + '/' + MEDIA_ROOT
现在我可以解决它,但这不是一个长期的解决方案.有什么想法吗?
For now i can work around it, but that is not a long term solution. any ideas?
推荐答案
Danigosa在此主题中的答案是: django-storages和亚马逊s3-可疑操作
Danigosa's answer in this thread is the answer: django-storages and amazon s3 - suspiciousoperation
创建一个特殊的存储类,如本文所述: 使用Amazon S3存储Django网站的静态和媒体文件.
Create a special storage class as outlined in this post: Using Amazon S3 to store your Django sites static and media files.
然后像这样覆盖_normalize_name
:
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = settings.STATICFILES_LOCATION
def _clean_name(self, name):
return name
def _normalize_name(self, name):
if not name.endswith('/'):
name += "/"
name += self.location
return name
class MediaStorage(S3Boto3Storage):
location = settings.MEDIAFILES_LOCATION
def _clean_name(self, name):
return name
def _normalize_name(self, name):
if not name.endswith('/'):
name += "/"
name += self.location
return name
最后-(至少在Python 3上)不要使用
Finally - (on Python 3 at least) DON'T use
{% load static from staticfiles %}
在您的模板中.
附上:
{% load static %}
这篇关于Django Amazon S3 SuspiciousOperation的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!