我有这段代码:
def save_to_gcs(self, img, img_obj):
'''
Image data, Image metadata object -> Blob Key
Given an image and image metadata, stores it in a GCS bucket
'''
bucket = '/foo'
filename = bucket + '/' + str(img_obj['filename'])
self.tmp_filenames_to_clean_up = []
logging.info('Creating file %s\n' % img_obj['filename'])
write_retry_params = gcs.RetryParams(backoff_factor=1.1)
gcs_file = gcs.open(filename,
'w',
content_type=img_obj['mimetype'],
retry_params=write_retry_params)
gcs_file.write(img)
gcs_file.close()
self.tmp_filenames_to_clean_up.append(filename)
return blobstore.create_gs_key('/gs/' + filename)
但它失败了这个错误:
Expect status [201] from Google Storage. But got status 403. Response headers: {'content-length': '145', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'HTTP Upload Server Built on Jun 7 2013 11:30:13 (1370629813)', 'pragma': 'no-cache', 'cache-control': 'no-cache, no-store, must-revalidate', 'date': 'Thu, 20 Jun 2013 23:13:55 GMT', 'content-type': 'application/xml; charset=UTF-8'}
Traceback (most recent call last):
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~foo/5.368231578716365248/main.py", line 409, in post
blob_key = self.save_to_gcs(img, img_obj) # Save the image to a GCS bucket. returns a blob_key
File "/base/data/home/apps/s~foo/5.368231578716365248/main.py", line 448, in save_to_gcs
retry_params=write_retry_params)
File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/cloudstorage_api.py", line 69, in open
return storage_api.StreamingBuffer(api, filename, content_type, options)
File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/storage_api.py", line 527, in __init__
errors.check_status(status, [201], headers)
File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/errors.py", line 99, in check_status
raise ForbiddenError(msg)
ForbiddenError: Expect status [201] from Google Storage. But got status 403. Response headers: {'content-length': '145', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'HTTP Upload Server Built on Jun 7 2013 11:30:13 (1370629813)', 'pragma': 'no-cache', 'cache-control': 'no-cache, no-store, must-revalidate', 'date': 'Thu, 20 Jun 2013 23:13:55 GMT', 'content-type': 'application/xml; charset=UTF-8'}
任何有关解密该错误并提出解决方案的帮助都将非常感激。
由于
答案 0 :(得分:9)
文档因批准访问您的应用引擎应用而感到困惑(这很可能是您的问题)。以下是最新Google Cloud Console中对我有用的内容:
答案 1 :(得分:6)
同样的事发生在我身上,令我感到困惑。我按照先决条件部分的this page步骤操作了。但有几点注意到:
这应该对你有用,因为它对我有用。
答案 2 :(得分:1)
...除了上述内容之外,还可以转到“API”(在“云控制台”中项目下的“API和Auth”下),并确保“Google云端存储”已打开。 在“结算”下,确保已开启。
答案 3 :(得分:1)
这对我不起作用。 谷歌说我们必须采取下面提到的方法。
为您的桶或对象授予权限。 要使您的应用能够在存储桶中创建新对象,您需要执行以下操作:
登录App Engine管理控制台。 单击要为云存储桶授权的应用程序。 单击左侧“管理”部分下的“应用程序设置”。 复制服务帐户名称下的值。这是您的应用程序的服务帐户名称,格式为application-id@appspot.gserviceaccount.com。如果您使用的是App Engine Premier帐户,则应用程序的服务帐户名称格式为application-id.example.com@appspot.gserviceaccount.com。 使用以下方法之一授予访问权限: 授予应用程序访问存储分区的最简单方法是使用Google Cloud Console将应用程序的服务帐户名称作为团队成员添加到包含存储分区的项目中。您可以在Google云端控制台左侧边栏的“权限”下执行此操作。如果需要写入存储桶,应用应具有编辑权限。有关云存储中权限的信息,请参阅范围和权限。如果需要,可以向项目团队添加更多应用。 注意:在某些情况下,您可能无法将服务帐户添加为团队成员。如果您无法添加服务帐户,请使用备用方法,即存储桶ACL,如下所述。