google-app-engine标准中的google-cloud-storage权限被拒绝

时间:2017-08-08 00:42:02

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

尝试使用client library for Python从谷歌应用引擎标准运行烧瓶内部访问谷歌云存储桶。

编辑)未获得官方支持。查看解决方法的答案。

代码看起来像这样..

from flask import Flask
from google.cloud import storage

# UNCOMMENT THIS FOR SOLUTION
#import requests_toolbelt.adapters.appengine
#requests_toolbelt.adapters.appengine.monkeypatch()

app = Flask(__name__)
@app.route('/endpoint', methods=['POST', 'PUT'])
def upload_to_storage():
    try:

      # file info
      filename = secure_filename(file.filename)
      mimetype = file.content_type

      # connect to bucket
      client = storage.Client(project='projectName')
      bucket = client.get_bucket('bucketName')

      # upload file to bucket
      blob = storage.Blob(filename, bucket)
      blob.upload_from_file(file, content_type=mimetype, num_retries=10)

      return jsonify({'status':200})

    except:

      return jsonify({'status':500})

错误消息:

('连接已中止。',错误(13,'权限被拒绝')

2 个答案:

答案 0 :(得分:2)

回答

GAE标准中没有正式支持

(编辑)google.cloud.storage,要使身份验证工作(google-auth)需要执行一些额外的步骤:

更新requirements.txt

  

请求-工具区

假设您正在向第三方库中的供应商使用名为“lib”的目录

$ pip install -r requirements.txt -t lib

更新appengine_config.py from google.appengine.ext import vendor vendor.add('lib')

更新main.py(或同等版本) import requests_toolbelt.adapters.appengine requests_toolbelt.adapters.appengine.monkeypatch()

更新app.yaml libraries: - name: ssl version: latest

答案 1 :(得分:1)

使用专为GAE标准操作而设计的GCS客户端,而不是使用google.cloud.storage模块: https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/setting-up-cloud-storage#downloading_the_client_library。 该客户端将隐式执行身份验证,以避免“权限被拒绝”#39;错误。

以下页面演示了如何使用客户端编写:h ttps://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage#writing_to_cloud_storage。唯一缺少的信息是"文件名"在示例中的格式为" //"。写操作负责定位和写入正确的存储桶(您不需要事先检索存储桶)。