Google app engine 生产中的Blobstore不获取BlobKey(而在dev_appserver中获取)

Google app engine 生产中的Blobstore不获取BlobKey(而在dev_appserver中获取),google-app-engine,python-2.7,google-cloud-storage,blobstore,Google App Engine,Python 2.7,Google Cloud Storage,Blobstore,我有一个进程,从给定的URL获取一个图像,并将其保存到Google云存储中,然后检索一个服务URL。现在,我的理解(从我阅读的文档中)是,我还必须在引用GCS文件的过程中创建blob。如果我的理解不正确,请让我知道 获取图像并尝试保存它的处理程序是: img_request = urlfetch.fetch(img_url) if img_request.status_code == 200: img_title = hashlib.sha1(

我有一个进程,从给定的URL获取一个图像,并将其保存到Google云存储中,然后检索一个服务URL。现在,我的理解(从我阅读的文档中)是,我还必须在引用GCS文件的过程中创建blob。如果我的理解不正确,请让我知道

获取图像并尝试保存它的处理程序是:

img_request = urlfetch.fetch(img_url)
    if img_request.status_code == 200:
        img_title               = hashlib.sha1(img_url).hexdigest()
        img_content             = img_request.content
        img_type                = img_request.headers['content-type']
        cloud_storage_filename  = '/images/%s/%s' % (self.source_name, img_title)

        blobstore_filename      = '/gs%s' % cloud_storage_filename
        blobstore_key           = blobstore.create_gs_key(blobstore_filename)

        cloud_storage_file      = gcs.open(filename=cloud_storage_filename, mode='w', content_type=img_type)
        cloud_storage_file.write(img_content)
        cloud_storage_file.close()

        # If I print blobstore_key at this stage, I am getting a result here.
        blobstore_key           = blobstore.get(blobstore_key).key()
        blobstore_serving_url   = images.get_serving_url(blobstore_key)

        # Structured Property to be part of a Datastore Model
        img_model = data_model.Image(
            s_source_url    = img_url,
            k_blob_key      = blobstore_key,
            s_serving_url   = blobstore_serving_url
        )
        return img_model
这在dev_appserver上运行良好,但在生产中会引发以下错误:

   blobstore_key           = blobstore.get(blobstore_key).key()
   AttributeError: 'NoneType' object has no attribute 'key'
为什么在生产中而不是在dev_appserver上引发此错误?就好像一开始没有生成密钥一样

正如我在代码中所评论的那样,当我在调用
blobstore.get(blobstore.key()
之前打印
blobstore\u键时,它会打印出一个键,因此它会一直工作到那里。问题大概是,当我在键上调用
blobstore.get()
时,它会得到
None
。。。为什么

还是我做错了什么? 谢谢

blobstore.get()
BlobInfo.get()
的同义词,第页上有一条说明:

但是,BlobInfo对象目前不可用于GCS对象

这将解释为什么
blobstore.get()
返回
None

另外,您不希望从这两行收到相同的结果吗

blobstore_key = blobstore.create_gs_key(blobstore_filename)
blobstore_key = blobstore.get(blobstore_key).key()
似乎部分回答了我的疑问,为什么它在生产中不起作用。但是,如何获取图像的服务url呢

替代:

blobstore_key = blobstore.create_gs_key(blobstore_filename)
与:


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

当您拥有blob_键时,可以使用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`

它们不会返回相同的内容。一个是GS键,另一个是BlobKey。我需要BlobKey来获取实际提供图像的服务url。@MichaelGradek在链接页面上有一个注释:“获得GCS对象的blobKey后,您可以将其传递、序列化,或者在任何可以对Blobstore中存储的对象使用blobKey的地方互换使用它。这允许应用程序在blobstore中存储一些数据,在GCS中存储一些数据,但在其他方面与应用程序的其余部分相同。”在示例中,它们使用
blobstore.fetch_data()
从GS获取数据。你可能遇到了我在这个问题上提出的同一个问题:现在,我放弃了我的转换,直到完全澄清为止。@gae123是的,我找到了你的帖子,它帮助我解决了我用例中的问题。因为我只需要调用
获取服务url()
在一个上传到GCS的文件上,根据文档,我需要获取一个
blobstore.BlobKey
来传递给
get\u service\u url
,所以基本上我所做的就是调用
blobstore.BlobKey(blobstore.create\u gs\u key(blobstore\u filename))
这将返回一个
BlobKey
对象,我可以使用该对象调用
get\u serving\u url
。您不需要BlobInfo。BlobKey from blobstore.create\u gs\u键可以传递给images.get\u serving\u url。但是,您应该注意images.get\u serving\u url只对图像有效。例如,它对渲染的svg文件无效图像
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`