9

Amazon S3 で django-storages を使用しています。次のエラーが断続的に表示されます。

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:

なぜこれが表示されるのか誰か知っていますか?それはいつも起こるわけではありません。他の場合でもこれを正常に実行できます。

4

5 に答える 5

4

_normalize_nameは、URL を使用して Django で多くの凝った処理を行い、ほとんど不要です。私の場合、次のように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 simple ImageFieldで機能しました:

AWS_ACCESS_KEY_ID = 'TTTT'
AWS_SECRET_ACCESS_KEY = 'XXXX'
AWS_STORAGE_BUCKET_NAME = 'ZZZZ'
于 2015-03-17T14:21:29.750 に答える
2

default_storage メソッドを使用する場合は、必ず file.name を使用してください。

正しい:

default_storage.delete(file.name)

違う:

default_storage.delete(file.url)

違う:

default_storage.delete(file)

上記の 3 つの例はすべてローカル ファイルで機能しますが、s3 を使用する場合、file.name を使用しない限り、このエラーが発生します。

于 2013-04-15T20:05:41.387 に答える
1

自分のプロジェクトではまだ S3 ストレージを使用していませんが、このエラーに出くわしたので、正しい方向に向けることができるかもしれません。

S3BotoStorage._clean_name() を見ると、それはただのreturn os.path.normpath(name).replace('\\', '/'). os.path.normpath() はURLの//を\\に変換し、.replace() はそれを\に変換します。次に、 S3BotoStorage._normalize_name() は、この壊れた URL がそれが表す場所の一部であることを確認しますが、もちろんそうではありません。SuspiciousOperation エラーが発生している場所です。

そのため、'name' は、AWS URL 全体ではなく、ローカル パスを意味しているように見えます。私の場合、直接の原因はFILEBROWSER_DIRECTORY = MEDIA_URL + "uploads/"settings.py にありました。これは、アップロード フォルダーが見つからないという別のエラーを修正することを望んでいました。

于 2012-09-22T14:22:11.623 に答える
0

設定

MEDIA_ROOT=''

私の問題を修正しました。

于 2013-05-04T18:09:10.877 に答える
-1

これを修正し、 SuspiciousOperation on except を追加しました:

class S3CustomStorage(S3BotoStorage):
    def _normalize_name(self, name):
        try:
            return safe_join(self.location, name)
        except (SuspiciousOperation, ValueError):
            return ""
于 2016-11-24T10:58:33.423 に答える