Python 谷歌应用引擎-在单独的项目中使用谷歌云存储,项目名称中有特殊字符

Python 谷歌应用引擎-在单独的项目中使用谷歌云存储,项目名称中有特殊字符,python,google-app-engine,google-cloud-storage,Python,Google App Engine,Google Cloud Storage,我正在另一个项目中尝试从GAE(Python)应用程序读写GCS bucket。另一个项目: 账单已经设置好了吗 已在试图写入的存储桶上授予对GAE应用程序服务帐户的写入权限 但是,我无法从我的GAE应用程序写入存储桶。该项目(我没有设置)在项目ID中有一个冒号(:),我得到了错误ValueError:Path的格式应该是/bucket/filename… 我尝试使用项目ID的url转义版本(即,在bucket路径的第一段中),但得到了相同的错误 我还尝试使用项目编号作为路径的第一段,但是它

我正在另一个项目中尝试从GAE(Python)应用程序读写GCS bucket。另一个项目:

  • 账单已经设置好了吗
  • 已在试图写入的存储桶上授予对GAE应用程序服务帐户的写入权限
但是,我无法从我的GAE应用程序写入存储桶。该项目(我没有设置)在项目ID中有一个冒号(:),我得到了错误
ValueError:Path的格式应该是/bucket/filename…

我尝试使用项目ID的url转义版本(即,在bucket路径的第一段中),但得到了相同的错误

我还尝试使用项目编号作为路径的第一段,但是它找不到bucket:
NotFoundError:Expect status[201]from Google Storage。但状态为404。

是否有可能引用这样一个桶?我是否需要以某种方式使用
x-goog-project-id
标题


编辑:地面军事系统适配器代码 注意,bucket设置为从配置文件读取,它最终类似于
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

试着用这样的东西来拿你的桶:

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

你能展示你的代码吗?我有一个GAE应用程序,它成功地从另一个项目中的GCS存储桶读取数据,该项目名称中带有冒号。我想如果我能看到你的代码和我的代码有什么不同,我可以帮助你。好的,我在上面加了这个。我觉得这是一个云配置问题,但感谢您的关注。再仔细研究一下,我想我误解了-项目ID不是bucket路径的第一部分,那么?而是在x-goog-project-id标题中设置?在这种情况下,我似乎不能使用appengine GCS接口(它不允许您设置标题),而是使用通用REST客户端(google api python客户端)?我不需要设置任何标记。GCS存储桶名称,因此无需指定任何项目。(我忘了这一点。)如果你已经为你的应用程序正确设置了访问bucket的权限(对我来说,这只是在bucket上拥有另一个应用程序的具有写入权限的服务帐户),我想你就可以访问它了。请尝试
test\u iterator=gcs.listbucket('/bucket/')
,看看您是否在该bucket中的项上获得了一个迭代器。@Mario-如果您传入的bucket名称只是bucket的名称,而不是项目名称或id的前缀,则上述代码可以按原样工作。