【问题标题】:Celery, Django and S3 Default Storage causes file reading issuesCelery、Django 和 S3 默认存储导致文件读取问题
【发布时间】:2017-11-06 15:23:47
【问题描述】:

我有一个过程,其中网络服务器注入文件(通过上传),使用 default_storages 将该文件保存到 S3,然后为该文件创建一个任务,以通过 celery 由后端处理。

def upload_file(request):
  path = 'uploads/my_file.csv'
  with default_storage.open(path, 'w') as file:
    file.write(request.FILES['upload'].read().decode('utf-8-sig'))
  process_upload.delay(path)
  return HttpResponse()

@shared_task
def process_upload(path):
  with default_storage.open(path, 'r') as file:
    dialect = csv.Sniffer().sniff(file.read(1024]))
    file.seek(0)
    reader = csv.DictReader(content, dialect=dialect)
    for row in reader:
      # etc...

问题是,尽管我在写入和读取时明确使用文本模式,但当我读取文件时,它以bytes 的形式出现,这是 csv 库无法处理的。有没有办法在不读取和解码内存中的整个文件的情况下解决这个问题?

【问题讨论】:

    标签: python django django-storage


    【解决方案1】:

    似乎您需要将b(二进制模式)添加到open 调用中:

    来自docs

    'b' 附加到模式以二进制模式打开文件:现在数据以字节对象的形式读取和写入。 此模式适用于所有不包含文本的文件

    @shared_task
    def process_upload(path):
      with default_storage.open(path, 'rb') as file:
          # Rest of your code goes here.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2017-09-08
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多