生产中的Blobstore没有得到BlobKey(而在dev_appserver中它确实如此)

时间:2013-12-29 17:51:41

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

我有一个流程从给定的网址中提取图片并将其保存到Google云端存储并检索服务网址。现在,我的理解(从我读过的文档中)是我还必须在引用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_key之前打印blobstore.get(blobstore_key).key()时,它会打印出一个键,所以它一直工作到那里。问题是,当我在密钥上调用blobstore.get()时,它会得到None ...为什么???

或者我做错了什么? 谢谢!

4 个答案:

答案 0 :(得分:7)

blobstore.get()BlobInfo.get()的同义词,this页上的注释说明:

  

但是,BlobInfo对象当前不适用于GCS对象。

这可以解释为什么blobstore.get()会返回None

另外,你不期望从这两行获得相同的结果吗?

blobstore_key = blobstore.create_gs_key(blobstore_filename)
blobstore_key = blobstore.get(blobstore_key).key()

答案 1 :(得分:3)

解决。

取代:

blobstore_key = blobstore.create_gs_key(blobstore_filename)

使用:

blobstore_key = blobstore.BlobKey(blobstore_key)

答案 2 :(得分:2)

BlobInfo object from a BlobKey created using blobstore.create_gs_key似乎可以部分回答我对为什么它在生产中不起作用的疑虑。但是,如何获取图像的servng_url呢?

答案 3 :(得分: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