【问题标题】:Google App Engine - using Google Cloud Storage in separate project, project has special characters in nameGoogle App Engine - 在单独的项目中使用 Google Cloud Storage,项目名称中有特殊字符
【发布时间】:2014-09-30 22:04:14
【问题描述】:

我正在尝试在单独的项目中从 GAE (Python) 应用程序读取和写入 GCS 存储桶。另一个项目:

  • 已设置帐单
  • 已授予 GAE 应用在其尝试写入的存储桶上的服务帐户的写​​入权限。

但是,我无法从我的 GAE 应用程序写入存储桶。该项目(我没有设置)在项目 ID 中有一个冒号 (:),我收到错误 ValueError: Path should have format /bucket/filename...

我尝试使用项目 ID 的 url 转义版本(即,在存储桶路径的第一段中),并得到了同样的错误。

我也尝试使用项目编号作为路径的第一段,但找不到存储桶:NotFoundError: Expect status [201] from Google Storage. But got status 404.

是否可以引用这样的存储桶?我是否需要以某种方式使用x-goog-project-id 标头?


编辑:GCS 适配器代码

请注意,存储桶设置为从配置文件中读取,它最终类似于Uploader('my:gcs-project/folder')。由于收到错误消息,我确信它设置正确。

import os.path
import cloudstorage as gcs

class Uploader():

  def __init__(self,bucket):
    self._bucket = bucket
    self._path   = ''
    self._meta   = {}
    self._type   = None

  def datasend(self, id):
    self._path = id
    return self

  def description(self, _):
    self._meta['x-goog-meta-desc'] = _
    return self

  def type(self, _):
    self._type = _
    return self

  def fullpath(self, filename):
    return "/".join([
             part for part in [
               "", self._bucket, self._path, os.path.basename(filename)
             ] if not (part is None)
           ])

  def __call__(self, file):
    self.upload(file)

  def upload(self, file):
    gcs_file = None
    try:
      gcs_file = gcs.open( self.fullpath(file.filename),
                           'w',
                           content_type=self._type,
                           options=self._meta
                         )
      for chunk in fbuffer(file.file):
        gcs_file.write(chunk)

    finally:
      if gcs_file:
        gcs_file.close()

def fbuffer(f, size=10240):
  while True:
    chunk = f.read(size)
    if not chunk: break
    yield chunk

【问题讨论】:

  • 你能展示你的代码吗?我有一个 GAE 应用程序,它成功地从另一个项目中的 GCS 存储桶中读取,该项目名称中有一个冒号。我怀疑如果我能看到您的代码与我的代码有何不同,我可以为您提供帮助。
  • 好的,我在上面添加了。我感觉这是一个云配置问题,但感谢您查看它。
  • 再看一遍,我想我理解错了——项目ID 不是存储桶路径的第一部分,那么?相反,您将其设置在 x-goog-project-id 标头中?在这种情况下,我似乎不能使用 appengine GCS 接口(它不允许您设置该标头),而是使用通用 REST 客户端(google-api-python-client)?
  • 我不必设置任何标签。 GCS 存储桶名称are all unique,因此无需指定项目。 (我忘记了这一点。)如果您已为您的应用程序正确设置了访问存储桶的权限(对我而言,这只是让其他应用程序的服务帐户对存储桶具有写入权限),我认为您将能够访问它。试试test_iterator = gcs.listbucket('/bucket/'),看看你是否在那个桶里的项目上得到了一个迭代器。
  • @Mario - 上面的代码按原样工作,前提是您传入的存储桶名称只是您的存储桶名称,而不是您的项目名称或 ID 作为前缀。

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


【解决方案1】:

尝试用这样的方式获取您的存储桶:

bucket_name = os.environ.get('BUCKET_NAME', app_identity.get_default_gcs_bucket_name())
bucket = '/' + bucket_name
filename = bucket + '/' + "myfile.jpg"

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2015-08-02
    • 2016-01-11
    • 2019-12-09
    • 2014-03-22
    • 2014-09-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多