4

Heroku は 30 秒後にタイムアウトするため、ユーザーが送信したファイルを S3 に直接アップロードする必要があります。それらを S3 にアップロードした後、データベースにエントリを挿入して、このファイルを受信したことを記録します。これが私のモデルです:

class UserUploadedFile(models.Model):
    id = models.AutoField(primary_key=True)
    uid = models.ForeignKey('auth.user', editable=False, db_column='uid')
    filepath = models.FileField(storage=S3BotoStorage(bucket='whatever'), upload_to='/')

しかし、Boto は自動的に呼び出されるため、このように save() を呼び出すと、ファイルを処理するために Boto が呼び出されます。

file = UserUploadedFile(uid=request.user, filepath=key)
file.save() 

(URL、ファイルサイズなどを後で取得できるように、ファイルパスを Boto で処理する必要があるため、ファイルパスを文字列に変換することはできません。)

とにかく、Boto を回避するために、save() を次のようにオーバーライドしてみました。

def save(self, *args, **kwargs):
    filepath = self.filepath
    if self.filepath:
        self.filepath = ''
    super(UserUploadedFile, self).save(*args, **kwargs)
    self.raw('UPDATE mysite_useruploadedfile SET filepath=%s WHERE id=%d', [filepath, self.pk])

しかし、私はこのエラーが発生します:

'UserUploadedFile' object has no attribute 'raw'

このコンテキストで raw() を呼び出す方法がわかりません。明らかに...

...しかし、私の主な質問は、これがこのテーブルに書き込むときにストレージ エンジンをバイパスする正しい方法なのか、それともよりクリーンな方法があるのか​​ということです。

ありがとう!

4

1 に答える 1

0

django-storages http://django-storages.readthedocs.org/en/latest/index.htmlのようなアプリを使用して、ストレージ バックエンドをカスタム バックエンドでオーバーライドできます。アップロードすると、Amazon s3 もサポートされ、URL を取得できます。ファイルを簡単に

于 2012-09-24T19:36:58.973 に答える