Получение содержимого файла django-storages для обработки

Когда я локально обслуживал мультимедиа, и мне нужно было выполнить задачу, получить содержимое файла было очень просто. Однако я только что перешел на django-хранилища, и это не капля замены. Может ли кто-нибудь предоставить мне метод, который вытащит документ из S3, чтобы я мог его обработать.

Старый способ:

filename = settings.MEDIA_ROOT + "/" + document.name
xlsx = XLSXParser(filename = filename, uniq_header_column='XYX')

Однако я перешел на django-хранилища, и это (очевидно) не сработает. Как вытащить локальную копию файла из 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()

Спасибо за помощь.


person rh0dium    schedule 20.08.2012    source источник
comment
Отвечает ли это на ваш вопрос? метод Django FileField (или ImageField) open() возвращает None для допустимого файла?   -  person mlissner    schedule 07.04.2021
comment
Этот пост имеет очень близкий дубликат здесь: stackoverflow.com/questions/9421797/   -  person mlissner    schedule 07.04.2021


Ответы (1)


Используйте файловый объект Django и Storage API , оба точно созданы для вашего случая использования. Для конкретных расширений проверьте это превосходное приложение и выберите S3 Storage Backend.

person schacki    schedule 20.08.2012
comment
Я позволю этому быть ответом - оказывается, это была ошибка, которую я обнаружил с помощью openpyxl. - person rh0dium; 21.08.2012