使用blobstore.create_gs_key创建的BlobKey中的BlobInfo对象

时间:2013-10-10 05:24:36

标签: python google-app-engine blobstore google-cloud-storage

我正在将代码转换为弃用的文件api。

我有以下代码在SDK服务器中正常工作但在生产中失败。我正在做的甚至是正确的吗?如果是,那可能是什么问题,任何想法如何解决它?

# Code earlier writes the file bs_file_name. This works fine because I can see the file
# in the Cloud Console.
bk = blobstore.create_gs_key( "/gs" + bs_file_name)
assert(bk)
if not isinstance(bk,blobstore.BlobKey):
    bk = blobstore.BlobKey(bk)
assert isinstance(bk,blobstore.BlobKey)
# next line fails here in production only
assert(blobstore.get(bk))  # <----------- blobstore.get(bk) returns None 

3 个答案:

答案 0 :(得分:5)

不幸的是,根据文档,您无法获取GCS文件的BlobInfo对象。

https://developers.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage

  

注意:获取GCS对象的blobKey后,您可以传递它,对其进行序列化,以及在可以将blobKey用于存储在Blobstore中的对象的任何位置交替使用它。这允许在应用程序将某些数据存储在blobstore中而某些数据存储在GCS中时使用,但是应用程序的其余部分以相同的方式处理数据。 (但是,BlobInfo对象当前不适用于GCS对象。)

答案 1 :(得分:1)

我今天遇到了同样的问题,当使用谷歌云存储时,感觉非常像blobstore api中的错误。

我没有利用blobstore api,而是使用了谷歌云存储客户端库。该库可以在这里下载:https://developers.google.com/appengine/docs/python/googlecloudstorageclient/download

要访问GCS上的文件:

import cloudstorage as gcs

with gcs.open(GCSFileName) as f:
    blob_content = f.read()
    print blob_content

答案 2 :(得分:0)

在本地模式或生产环境中使用blobInfo时,GAE有不同的行为,我花了一段时间才发现这一点,但一个简单的解决方案就是:

当您拥有blob_key时,可以使用blobReader访问数据。

def getBlob(blob_key):
  logging.info('getting blob('+blob_key+')')

  with blobstore.BlobReader(blob_key) as f:
    data_list = []
    chunk = f.read(1000)
    while chunk != "":
      data_list.append(chunk)
      chunk = f.read(1000)

    data = "".join(data_list)

  return data`

https://developers.google.com/appengine/docs/python/blobstore/blobreaderclass