【问题标题】:boto - more concise way to get key's value from bucket?boto - 从桶中获取键值的更简洁的方法?
【发布时间】:2014-01-15 10:19:08
【问题描述】:

我正在尝试找出一种简洁的方法来通过 boto 从 s3 获取数据

我当前的代码如下所示。 s3 manager 只是一个为我的应用完成所有 s3 设置的类。

    log.debug("generating downloader")
    downloader = s3_manager()

    log.debug("accessing bucket")
    bucket_archive = downloader.s3_buckets['@archive']

    log.debug("getting key")
    key = bucket_archive.get_key(archive_filename)

    log.debug("getting key into string")
    source = key.get_contents_as_string()

问题是,查看我的调试日志,我向 amazon s3 发出了两个请求:

    key = bucket_archive.get_key(archive_filename)
    source = key.get_contents_as_string()

查看文档 [http://boto.readthedocs.org/en/latest/ref/s3.html],似乎对 get_key 的调用检查它是否存在,而第二个调用获取实际数据。有谁知道同时做这两种方法的方法?对于我们的应用来说,最好使用一种更简洁的方式来处理一个请求。

【问题讨论】:

    标签: amazon-s3 boto


    【解决方案1】:

    get_key() 方法对对象执行 HEAD 请求以验证它是否存在。如果您确定存储桶和密钥存在并且不希望有 HEAD 请求的开销,您可以直接创建一个 Key 对象。这样的事情会起作用:

    import boto
    s3 = boto.connect_s3()
    bucket = s3.get_bucket('mybucket', validate=False)
    key = bucket.new_key('myexistingkey')
    contents = key.get_contents_as_string()
    

    get_bucket 的调用中的validate=False 消除了同样用于验证存储桶是否存在的GET 请求。

    【讨论】:

    • 太棒了。谢谢。我从您的回复中获得(并确认)的相关信息是,我可以在现有项目上调用 new_key() + get_contents_as_string() 而不是 get_key() + get_contents_as_string() 。我从来没有想过在现有项目上调用new
    • 好吧,新方法实际上只是一种快捷方式,可以使用已初始化的存储桶对象的引用来创建具有特定名称的 Key 对象。您也可以使用 Key(bucket, name) 创建一个密钥。我只是懒惰,不想导入 Key 类 8^)
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2023-01-12
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多