【问题标题】:Django: Uploading a CSV file to AWS S3Django:将 CSV 文件上传到 AWS S3
【发布时间】:2021-02-02 18:56:30
【问题描述】:

我们有一个 Django 应用程序,需要根据用户需求创建一个 csv 文件并将其上传到 AWS S3。我们有一个函数可以创建HttpResponse 对象responsecontent_type="text/csv" 我们尝试了很多方法:

  1. boto3:
s3 = boto3.client("s3")
s3.put_object(Body=response.content, Bucket="my-bucket", Key="file_path_and_name.csv")

这在我的本地机器上工作,但是当部署到 Google App Environment 时,我们收到一个错误,说 boto3 找不到凭据。 AWS 凭证位于我们的应用程序设置文件中。 (如果我们不这样做,它将如何在我的本地计算机上工作?)

  1. django-storages:我们已经成功地使用存储来允许用户从同一个 s3 存储桶,在同一个应用程序(本地和部署)中下载文件。所以我想我会尝试一下:
storage = S3Boto3Storage()
storage.save("file_path_and_name.csv", response.content)

这产生了错误:AttributeError: 'bytes' object has no attribute 'seek' 这是因为S3Boto3Storage 中的save 方法调用了content.seek(0, os.SEEK_SET) 那么...这是否意味着S3Boto3Storage 不能像boto3 那样接受字节串​​输入文件? (我认为S3Boto3Storage 后端是在boto3 之上构建的?) 我试过io.StringIO(response.content.decode("utf-8")),但我得到另一个错误,说字符串需要在散列之前进行编码。那时,我认为这必须是一种更好、更直接的方式。

有没有办法解决这两种方法?

我正在考虑的第三个选项是修改创建 HttpResponse 对象的函数,并使其使用 S3Boto3StorageFile 文件对象和相同的 csv 写入器将 csv 直接写入 s3。但是关于这种事情的文档相当缺乏(至少就我的专业水平而言)。我也欢迎在这方面提供一些建议。

【问题讨论】:

    标签: python django csv boto3


    【解决方案1】:

    我找到了一种让它工作的简单方法:直接在boto3.client 调用中提供凭据:

    s3 = boto3.client(
                "s3",
                aws_access_key_id=config("AWS_ACCESS_KEY_ID"),
                aws_secret_access_key=config("AWS_SECRET_ACCESS_KEY")
            )
    

    注意:我使用decouple 包来保证我的凭据安全。这就是config("...") 调用的意义所在。

    我的本​​地机器不需要特定凭据的原因是我设置了 AWS cli,这意味着我的凭据存储在本地文件中 ~/.aws/credentialsboto3 可以在那里找到它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2018-04-25
      相关资源
      最近更新 更多