我使用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应用程序默认服务帐户权限(存储管理员)。两种变体都没有改变,但是为了访问存储桶的对象很重要。
有人遇到过这个问题吗?可能是什么错误?我不明白为什么它上传图像时有效,但不适用于通过处理生成的图像。
答案 0 :(得分:1)
回溯建议您可能正在尝试调用images.get_serving_url()
,而异步操作可能仍在进行中。
如果该操作实际上是在GCS中保存转换后的图像,那么它可以解释失败:get_serving_url()
包括检查文件是否为有效图像,如果文件是TransformationError
则会失败尚未保存。
如果是这样 - 您可以通过以下方式解决问题:
get_serving_url()
get_serving_url()
的同时反复尝试TransformationError
,直到它不再失败为止。这有点冒险,因为如果引发TransformationError
的原因可能会导致无限循环,原因不仅仅是保存图像不完整。