ローカルでメディアを提供していて、ファイルの内容を取得するタスクを処理する必要があったときは、非常に簡単でした。しかし、私はdjango-storagesに移行したばかりであり、置き換えのドロップではありません。誰かが私にS3からドキュメントをプルして処理できるようにする方法を教えてもらえますか?
古い方法:
filename = settings.MEDIA_ROOT + "/" + document.name
xlsx = XLSXParser(filename = filename, uniq_header_column='XYX')
しかし、私はdjango-storagesに移行しましたが、これは(明らかに)機能しません。s3からファイルのローカルコピーをプルして処理するにはどうすればよいですか。私はこれを簡単に行うことができると思いました:
新しい(失敗した)方法:
filename = settings.MEDIA_ROOT + "/" + document.name
if not os.path.isfile(filename):
new_filename = tempfile.NamedTemporaryFile(delete=False)
new_filename.write(document.read())
filename = new_filename
xlsx = XLSXParser(filename = filename, uniq_header_column='XYX')
しかし、爆弾が発生するため、これに対してread()を実行することはできません。
Traceback (most recent call last):
File ".../celery/task/trace.py", line 212, in trace_task
R = retval = fun(*args, **kwargs)
File ".../tasks.py", line 63, in process_homes
process_homes_non_task(**kwargs)
File ".../tasks.py", line 33, in process_homes_non_task
new_filename.write(document.read())
File ".../django/core/files/utils.py", line 16, in <lambda>
read = property(lambda self: self.file.read)
File ".../django/db/models/fields/files.py", line 46, in _get_file
self._file = self.storage.open(self.name, 'rb')
AttributeError: 'FieldFile' object has no attribute 'storage'
結局、私はそれが古い方法と新しい方法の両方で機能する必要があります。明らかに私はこれを少し考えすぎています。
アップデート:
ドキュメントに従うことも役に立ちませんでした。
filename = settings.MEDIA_ROOT + "/" + document.name
if not os.path.isfile(filename):
from django.core.files.storage import default_storage
s3_file = default_storage.open(document.name, 'rb')
new_filename = tempfile.NamedTemporaryFile(delete=False)
new_filename.write(s3_file.read())
filename = new_filename
xlsx = XLSXParser(filename = filename, uniq_header_column='Lot_Number')
xlsx.load_workbook_and_sheet()
助けてくれてありがとう。