GAE 1.8.8更新后,Google云端存储中的图像不再显示

时间:2013-11-21 20:39:49

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

更新到GAE 1.8.8和GCS客户端到r127后,显示图像的代码不再使用开发服务器或生产。以前工作的代码现在通过开发中的以下错误:

Blob with key 'encoded_gs_file:blahblahblah' does not exist

注意blahblahblah只是我长篇大字的简写。

以下是我如何生成我的网址。这在过去一直有效。

bkey = blobstore.create_gs_key('/gs/mybucket/myfile.jpg')
url = images.get_serving_url(bkey, size=170, crop=True, secure_url=True)

以下是开发服务器的堆栈跟踪:

ERROR    2013-11-21 20:35:31,767 images_stub.py:405] Blob with key 'encoded_gs_file:c2l0ZS1hdWRpdC1waW5uYWNsZWNyZS9CYXR0ZXJ5L3Bob3Rvcy8yMDEzMTEyMTAwMTEyOUBhNzllYmQwNC05YWY3LTRhMWItYTg3My1mZGIwYjI5MjNjNzguanBn' does not exist
Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/images/images_stub.py", line 401, in _OpenBlob
blobstore_stub.BlobstoreServiceStub.ToDatastoreBlobKey(blob_key))
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py", line 651, in Get
return GetAsync(keys, **kwargs).get_result()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 612, in get_result
return self.__get_result_hook(self)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1541, in __get_hook
entities = extra_hook(entities)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py", line 620, in local_extra_hook
raise datastore_errors.EntityNotFoundError()
EntityNotFoundError
ApplicationError(1,)

阅读GAE 1.8.8的发行说明我在代码中看不到任何需要更改的内容。关于我做错的任何指示都会很棒。

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。我有点尴尬和惊讶我的代码之前工作。我的文件名中有一个@。我需要调用urllib2.quote()才能正确准备文件名。现在我得到一个合适的blob键。下面是我修改过的代码的示例。希望这有助于其他人。

filename = urllib2.quote('/gs/bucket/file@name.jpg')
bkey = blobstore.create_gs_key(filename)
url = images.get_serving_url(bkey, size=170, crop=True, secure_url=True)

编辑1:

似乎我只需要在开发服务器上执行 urllib2.quote()。生产中的事情破裂了。关于为什么在两种环境中表现不同,我有点困惑,但这段代码似乎在生产和开发中都能正常工作。

filename = '/gs/bucket/file@name.jpg'
if (os.getenv('SERVER_SOFTWARE') and not os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
    filename = urllib2.quote(filename)
bkey = blobstore.create_gs_key(filename)
url = images.get_serving_url(bkey, size=170, crop=True, secure_url=True)

编辑2:

我现在发现结果不一致,不确定原因。在我弄明白之前,我不会将我的答案标记为已被接受。如果其他人有答案,我会将你的标记作为答案。这是我发布到stackoverflow的第一个问题所以我对此很新。

有时我需要做一个urllib2.quote和其他我不需要的。我不知道是什么导致了这一点,但它始终在相同的文件上失败。所以我现在做了一些凌乱的尝试语句,如果这不起作用,我会再次尝试在除了部分之外,如下所示。

try:
    filename = urllib2.quote('/gs/bucket/file@name.jpg')
    bkey = blobstore.create_gs_key(filename)
    url = images.get_serving_url(bkey, size=170, crop=True, secure_url=True)
except:
    filename = '/gs/bucket/file@name.jpg'
    bkey = blobstore.create_gs_key(filename)
    url = images.get_serving_url(bkey, size=170, crop=True, secure_url=True)

以下是引用的两个文件:

/gs/bucket/20131124212800%40491524ca-8044-4a42-9fba-13b98352f730.jpg
/gs/bucket/20131124190014%40d8d318ee-1308-4711-9f54-9b1cd7d14d96.jpg

这里有两个引用的文件:

/gs/bucket/20131122170644%4028a4c1d8-7163-43fe-bc30-d35bf4f415cb.jpg
/gs/bucket/20131121154114%4043bb3dfc-ae84-4583-9f4d-24bbba459f19.jpg

因此,如果我用以下内容替换上面的两个,它们确实可以工作:

/gs/bucket/20131122170644@28a4c1d8-7163-43fe-bc30-d35bf4f415cb.jpg
/gs/bucket/20131121154114@43bb3dfc-ae84-4583-9f4d-24bbba459f19.jpg

我觉得我错过了一些简单的东西,但我不知道它是什么。任何帮助将不胜感激。