Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python google应用程序引擎标准中的google云存储权限被拒绝_Python_Google App Engine_Flask_Google Cloud Storage - Fatal编程技术网

Python google应用程序引擎标准中的google云存储权限被拒绝

Python google应用程序引擎标准中的google云存储权限被拒绝,python,google-app-engine,flask,google-cloud-storage,Python,Google App Engine,Flask,Google Cloud Storage,正在尝试使用从google app engine标准运行烧瓶内部访问google云存储桶 (编辑)不受官方支持。请参阅解决方法的答案 代码看起来像这样 from flask import Flask from google.cloud import storage # UNCOMMENT THIS FOR SOLUTION #import requests_toolbelt.adapters.appengine #requests_toolbelt.adapters.appengine.mon

正在尝试使用从google app engine标准运行烧瓶内部访问google云存储桶

编辑)不受官方支持。请参阅解决方法的答案

代码看起来像这样

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,“权限被拒绝”)

回答

(编辑)GAE标准不正式支持google.cloud.storage,要使身份验证生效(),需要执行一些额外的步骤:

更新需求.txt

请求工具带

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

$pip安装-r requirements.txt-t lib

更新appengine\u config.py

来自google.appengine.ext导入供应商
vendor.add('lib')

更新main.py(或同等版本)

导入请求\u toolbelt.adapters.appengine
请求\u toolbelt.adapters.appengine.monkeypatch()

更新app.yaml

图书馆:
-名称:ssl
版本:最新

不要使用google.cloud.storage模块,而是使用专门为在GAE标准内运行而设计的GCS客户端: . 此客户端将隐式执行身份验证,以避免出现“权限被拒绝”错误


下面的页面演示如何使用客户机编写:h。唯一缺少的信息是示例中的“文件名”格式为“/”。写入操作负责定位并写入正确的存储桶(您无需事先检索存储桶)。

应用程序引擎应用程序作为特定服务帐户运行。你的应用程序引擎应用程序的服务帐户是否有权限使用“我的桶”进行操作?是的,服务帐户有权限。我认为发生的事情是,我需要确保请求使用URLFetch,这不是问题信息,而是答案(编辑答案,以明确我不只是添加额外的问题信息)。这个答案是正确的,可以完成完整的monkeypatching,使谷歌云存储工作。当您需要从devserver访问联机bucket时,需要使用它。有时您需要从开发服务器访问联机bucket(只读操作是安全的)。使用标准的dev服务器无法执行此操作。上面的答案是一个很好的解决方法。