Python 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

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

  • bot3
  • 这在我的本地机器上运行,但当部署到Google应用程序环境时,我们得到一个错误,即boto3无法找到凭据。AWS凭据位于我们的应用程序设置文件中。(如果我们不这样做,它将如何在我的本地机器上工作?)

  • 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")
            )