【问题标题】:Flask: Could not authenticate the Google Cloud Storage clientFlask:无法验证 Google Cloud Storage 客户端
【发布时间】:2022-01-04 01:07:00
【问题描述】:

我正在制作一个网络应用程序,您可以在其中上传和下载文件,但我将它托管在 Heroku 上,因此我无法将文件存储在我的计算机上。我决定使用一个叫做 Flask-GoogleStorage 的东西,但它需要一个“谷歌云存储客户端”。我去了云控制台并创建了一个服务帐户并将私钥放入我的代码中,但我不断收到此错误:

[2022-01-03 19:54:20,784] WARNING in google_storage: Could not authenticate the Google Cloud Storage client

这是我用来设置存储的代码:

app.config['GOOGLE_APPLICATION_CREDENTIALS'] = PRIVATE_SERVICE_KEY
app.config['GOOGLE_STORAGE_LOCAL_DEST'] = UPLOAD_FOLDER
app.config['SERVER_NAME'] = SERVER_NAME
#Google cloud storage
with app.app_context():
    files = Bucket("files")
    storage = GoogleStorage(files)
    app.config.update(
        GOOGLE_STORAGE_LOCAL_DEST = app.instance_path,
        GOOGLE_STORAGE_SIGNATURE = {"expiration": timedelta(minutes=5)},
        GOOGLE_STORAGE_FILES_BUCKET = "files-bucket-id"
    )
    storage.init_app(app)

任何建议都会非常有帮助,因为我之前没有使用过这个谷歌平台,我很迷茫。

如果有任何更简单的在线存储文件的方法,我也非常感谢您知道这一点。

提前谢谢你!

【问题讨论】:

  • 我没用过Flask-GoogleStorage,但我熟悉GCP和云存储。当您创建服务帐户时,您是否为其分配了合适的权限(也许,为了测试,roles/storage.admin)。您是否创建了存储桶?存储桶名称必须全局唯一。如果files 对应一个Bucket 名称,你应该选择其他名称,也许是omikronII-220103-filesfilesfiles-bucket-id 之间的区别在文档中并不清楚。
  • 一件事,你可能需要export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/key.json 你运行 Flask。

标签: python flask google-cloud-platform google-cloud-storage


【解决方案1】:

好的,我认为我明白你需要做什么。

您需要安装 Cloud SDK (gcloud) 才能按照这些说明进行操作,但您也可以使用 Google 的 Cloud Console 完成所有操作:

BILLING=[[YOUR-BILLING-ACCOUNT]]
PROJECT=[[YOUR-PROJECT]]
BUCKET=[[YOUR-BUCKET]]
ACCOUNT=[[YOUR-SERVICE-ACCOUNT]]

# Create Project
gcloud projects create ${PROJECT}

# Associate Billing required for Cloud Storage
gcloud beta billing projects link ${PROJECT} \
--billing-account=${BILLING}

# Create Bucket
gsutil mb -p ${PROJECT} gs://${BUCKET}

# Create Service Account
gcloud iam service-accounts create ${ACCOUNT} \
--project=${PROJECT}

EMAIL=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com

# Grant Service Account permission to Cloud Storage
gcloud projects add-iam-policy-binding ${PROJECT} \
--role=roles/storage.admin \
--member=serviceAccount:${EMAIL}

# Create Service Account Key
gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
--iam-account=${EMAIL} \
--project=${PROJECT}

# Export
export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json

flask run

并且(将[[VARIABLES]] 替换为值):

from flask_googlestorage import GoogleStorage, Bucket

files = Bucket("files")
storage = GoogleStorage(files)

app = Flask(__name__)
app.config.update(
    GOOGLE_STORAGE_LOCAL_DEST = app.instance_path,
    GOOGLE_STORAGE_SIGNATURE = {"expiration": timedelta(minutes=5)},
    GOOGLE_STORAGE_FILES_BUCKET = "[[BUCKET]]"
)
storage.init_app(app)

【讨论】:

  • 这看起来非常有用,谢谢!我现在有点忙,但我会在今天结束之前尝试实现它,如果它有效,我会告诉你
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2014-08-11
  • 2013-11-12
  • 2015-01-25
  • 2016-01-26
相关资源
最近更新 更多