我正在将代码转换为弃用的文件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
答案 0 :(得分:5)
不幸的是,根据文档,您无法获取GCS文件的BlobInfo对象。
注意:获取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