获取django-storages文件的内容以进行处理

时间:2012-08-20 20:32:44

标签: django celery django-storage celery-task django-media

当我在本地服务媒体时,我需要处理任务,获取文件内容非常简单。然而,我只是转移到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')

但我不能对此进行读取(),因为它会爆炸。

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'

最后,我需要使用旧方法和新方法。显然我有点过分思考......

更新

docs之后也没有帮助。

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()

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用Django File ObjectStorage API,两者都是针对您的使用案例制作的。对于特定扩展,请检查此卓越性App并选择S3存储后端。