Python Django:将CSV文件上载到AWS S3
我们有一个Django应用程序,需要根据用户需求创建一个csv文件并将其上传到AWS S3。我们有一个函数,可以使用Python Django:将CSV文件上载到AWS S3,python,django,csv,boto3,Python,Django,Csv,Boto3,我们有一个Django应用程序,需要根据用户需求创建一个csv文件并将其上传到AWS S3。我们有一个函数,可以使用content\u type=“text/csv”创建HttpResponse对象响应,我们已经尝试了很多方法: bot3: 这在我的本地机器上运行,但当部署到Google应用程序环境时,我们得到一个错误,即boto3无法找到凭据。AWS凭据位于我们的应用程序设置文件中。(如果我们不这样做,它将如何在我的本地机器上工作?) django storages:我们已成功使用storag
content\u type=“text/csv”
创建HttpResponse
对象响应
,我们已经尝试了很多方法:
bot3
:django storages
:我们已成功使用storages,允许用户在同一个应用程序(本地和部署)中从同一个s3存储桶下载文件。所以我想我会尝试一下:AttributeError:“bytes”对象没有属性“seek”
这是因为S3Boto3Storage
中的save
方法调用content.seek(0,os.seek\u SET)
所以这是否意味着s3boto3存储
不能像boto3
那样接受bytestring输入文件?(我认为s3boto3存储
后端构建在boto3
?)之上)
我尝试了io.StringIO(response.content.decode(“utf-8”))
,但我得到了另一个错误,即字符串需要在散列之前进行编码。在那一点上,我认为这必须是一种更好、更直接的方法
有没有办法解决这两种方法中的任何一种
我考虑的第三个选项是修改创建HttpResponse对象的函数,并使其使用
S3Boto3StorageFile
file对象和同一个csv编写器将csv直接写入s3。但这方面的文档相当缺乏(至少就我的专业水平而言)。我也希望在这方面得到一些建议。我找到了一个简单的方法让它工作起来:直接在bot3中提供凭据。客户端
呼叫:
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/credentials
的本地文件中,bot3
可以在那里找到它们
storage = S3Boto3Storage()
storage.save("file_path_and_name.csv", response.content)
s3 = boto3.client(
"s3",
aws_access_key_id=config("AWS_ACCESS_KEY_ID"),
aws_secret_access_key=config("AWS_SECRET_ACCESS_KEY")
)