1

S3BotoStorage に基づいて新しいカスタム ストレージ クラスを作成しようとしていますが、次のコードでこのエラーが発生し続けます。

import sys
from django.core.files.storage import Storage
from storages.backends.s3boto import S3BotoStorage


class customStorage(S3BotoStorage):
    def __init__(self, *args, **kwargs):
        kwargs['bucket_name'] = 'bucket_1'
        print >> sys.stderr, 'Creating MyS3Storage'        
        super(S3BotoStorage, self).__init__(*args, **kwargs)

エラー:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
self._setup()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/files/storage.py", line 285, in _setup
self._wrapped = get_storage_class()()
File "/Users/abisson/Sites/poka/common/storages/models.py", line 10, in __init__
super(S3BotoStorage, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters

私の答えは、s3botoで複数の S3 バケットを指しているということに基づいています。通常でも、次のことができます。

obj1 = models.FileField(storage=S3BotoStorage(bucket='bucket_1'), upload_to=custom_upload_to)

そしてそれは動作します。(そして、コンストラクターに引数を渡します)

4

1 に答える 1

3

間違った init 関数を呼び出しています! 親に電話するつもりですが、親の親に電話しています。super() 行を次から変更する必要があります。

super(S3BotoStorage, self).__init__(*args, **kwargs)

に:

super(customStorage, self).__init__(*args, **kwargs)

一般に、super() コマンドは、現在のオブジェクトと、呼び出す親のクラスを取得します。人が実際に親の親に電話したい場合があるため、これは重要です。これは、必要に応じて子オブジェクトを親オブジェクトと見なすことができるため、許可されています。

于 2012-05-06T15:41:21.727 に答える