【发布时间】:2021-02-02 18:56:30
【问题描述】:
我们有一个 Django 应用程序,需要根据用户需求创建一个 csv 文件并将其上传到 AWS S3。我们有一个函数可以创建HttpResponse 对象response 和content_type="text/csv" 我们尝试了很多方法:
-
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 凭证位于我们的应用程序设置文件中。 (如果我们不这样做,它将如何在我的本地计算机上工作?)
-
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。但是关于这种事情的文档相当缺乏(至少就我的专业水平而言)。我也欢迎在这方面提供一些建议。
【问题讨论】: