我正在使用get_serving_url遇到以下错误,以便从存储桶中提供图像。

Traceback (most recent call last):
 File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
   return method(*args, **kwargs)
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 1087, in synctasklet_wrapper
   return taskletfunc(*args, **kwds).get_result()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 1057, in tasklet_wrapper
   result = func(*args, **kwds)
 File "/base/data/home/apps/e~tileserve20171207t210519.406056180994857717/blob_upload.py", line 70, in post
   bf.put_async()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3473, in _put_async
   self._pre_put_hook()
 File "/base/data/home/apps/e~tileserve/20171207t210519.406056180994857717/blob_files.py", line 124, in _pre_put_hook
   print images.get_serving_url(None, filename='/gs' + '/tileserve.appspot.com/user2test4test4RGB20170927.tif')
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1868, in get_serving_url
   return rpc.get_result()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1972, in get_serving_url_hook
   raise _ToImagesError(e, readable_blob_key)
 TransformationError


当我将图像上传到存储桶中时,它可以工作,但是当我通过应通过get_serving_url公开的处理创建图像时,出现TransformationError。

我尝试了两种投放图片的方法:

test = blobstore.create_gs_key('/gs' + '/path2object')
images.get_serving_url(test, secure_url=True)

images.get_serving_url(None, filename='/gs' + '/' + <bucket name>+  '/'+ <object name>)


我还设置了存储区对象的ACM权限和IAM App Engine应用程序的默认服务帐户权限(存储管理员)。两种变体都没有改变,但是对于访问存储桶的对象很重要。

有人遇到过这个问题吗?可能是什么错误?我不明白为什么上传图片时无法使用,但不适用于通过处理生成的图片。

最佳答案

追溯表明您可能试图在异步操作仍在进行时调用images.get_serving_url()

如果该操作实际上在GCS中保存了转换后的图像,则可以解释失败的原因:get_serving_url()包括检查该文件是否为有效图像,如果该文件尚未保存,则TransformationError会失败。

如果是这样-您可以通过以下任一方法解决问题:


切换到保存图像的同步版本
等待直到保存图像完成(以防万一,同时还有其他事情要做)-在调用get_serving_url()之前获取同步调用的结果
在捕获get_serving_url()时反复尝试TransformationError,直到不再失败为止。这有点冒险,因为如果TransformationError出于其他原因(而不是简单地保存不完整的图像)而升高,则可能会陷入无限循环。

10-05 17:40