2012-09-21 12 views
9

私はAmazon S3でdjango-storageを使用しています。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エラーが発生している場所です。

「名前」は、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

3つのexampl上のesはローカルファイルで動作しますが、s3を使用する場合はfile.nameを使用しない限りこのエラーが発生します。設定

MEDIA_ROOT='' 

+0

'file.url'は' file.name'とは異なって処理されます。私もこれをやったことがありますが、それは実際の解決策よりもハックのようです。このメソッドが例外を発生させないという事実以外に、これが本当に正しいことを示す情報源はありますか? – Bryan

+0

私は気づいていません。 – arctelix

+0

人生保護人。 – 101110101100111111101101

0

は私のために問題を修正しました。

3

_normalize_nameは、多くのファンキーで、URLでDjangoのものはほとんど必要ありません。

ImageField(storage=S3CustomStorage()) 

そしてそれは、この基本構成とジャンゴ簡単なのImageFieldのために働い:

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を上書き
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 ""