2012-09-21 3 views
9

Amazon S3에서 장고 저장소를 사용하고 있습니다.django-storage 및 amazon s3 - suspiciouoperation

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: 후 단일 / : 나는 다소 간헐적으로 다음과 같은 오류를 참조하십시오.

왜이 문제가 나타나는 지 알고 계십니까? 그것은 항상 발생하지 않습니다. 나는 다른 경우에 이것을 성공적으로 할 수 있습니다.

+0

누구나 해결책을 찾을 수 있습니까? –

답변

1

아직 내 자신의 프로젝트에서 S3 스토리지를 사용할 수 없지만이 오류가 발생하여 올바른 방향으로 가리킬 수 있습니다.

S3BotoStorage._clean_name()은 단지 return os.path.normpath(name).replace('\\', '/')입니다. os.path.normpath()는 URL의 //\\으로 변환 한 다음 .replace()를 \으로 변환합니다. 그런 다음 S3BotoStorage._normalize_name()은 깨진 URL이 그것이 나타내는 위치의 일부인지 확인합니다. 물론 그렇지 않습니다. 그것이 SuspiciousOperation 오류가 발생하는 곳입니다.

'name'은 전체 AWS URL 대신 로컬 경로 인 것처럼 보입니다. 내 경우에는 즉각적인 원인은 settings.py에서 FILEBROWSER_DIRECTORY = MEDIA_URL + "uploads/"이었는데 누락 된 업로드 폴더에 대한 다른 오류를 수정하려고 노력했습니다.

수정 :

default_storage.delete(file.name) 

잘못된 :

default_storage.delete(file.url) 

잘못된 :

default_storage.delete(file) 

모든 당신이 default_storage 방법이 file.name을 사용해야합니다 사용

2

세 가지 예 위의 es는 로컬 파일에서 작동하지만 s3을 사용하면 file.name을 사용하지 않는 한이 오류가 발생합니다. 설정

MEDIA_ROOT='' 

+0

'file.url'은'file.name'과 다르게 처리됩니다. 또한이 작업을 수행했지만 실제 솔루션보다 해킹처럼 보입니다. 이 메소드가 예외를 발생시키지 않는다는 것 외에 실제로 이것이 정확하다는 것을 나타내는 소스가 있습니까? – Bryan

+0

나는 알고있다. – arctelix

+0

생명의 보호자. – 101110101100111111101101

0

나를 위해 문제를 해결했습니다.

3

_normalize_name은 많은 장고를 필요로하지 않으며 장고에는 URL이 필요하지 않습니다. 그런 다음

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 

를 저장 속성에서 사용 : 내 경우에는 내가 그냥이 같은 S3BotoStorage를 오버라이드 (override)

ImageField(storage=S3CustomStorage()) 

그리고이 기본 구성으로 장고 간단한 ImageField 근무 :

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

다음을 제외하고 SuspiciousOperation을 추가하여 수정했습니다.

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