如何访问 Python google.cloud.storage 上传方法中的错误原因?

Posted

技术标签:

【中文标题】如何访问 Python google.cloud.storage 上传方法中的错误原因?【英文标题】:How to access error reason in Python google.cloud.storage upload methods? 【发布时间】:2020-01-21 11:01:43 【问题描述】:

我正在使用 Google 的 google-cloud-storage Python 包进行 GCS 访问。当我收到 403 错误时,可能有很多不同的原因。默认情况下,Google 的 SDK 仅提供此消息:

('Request failed with status code', 403, 'Expected one of', <HTTPStatus.OK: 200>)")

使用调试器,我可以更深入地查看库并发现 _upload.py 有一个 _process_response 方法,可以找到真正的 HTTP 响应,结果中包含以下消息:

"message": "$ACCOUNT does not have storage.objects.delete access to $BLOB."

问:我有什么方法可以访问这个更有用的错误代码或原始响应?

我希望向用户展示 e.g.过期的凭据并尝试执行您的凭据不允许的操作。

【问题讨论】:

【参考方案1】:

您使用的是什么版本的google-cloud-storage?最新的,还有这个例子:

from google.cloud import storage
client = storage.Client.from_service_account_json('service-account.json')
bucket = client.get_bucket('my-bucket-name')
blob = bucket.get_blob('test.txt')
try:
    blob.delete()
except Exception as e:
    print(e)

它打印以下内容:

403 DELETE https://storage.googleapis.com/storage/v1/b/my-bucket-name/o/test.txt?generation=1579627133414449: $ACCOUNT does not have storage.objects.delete access to my-bucket-name/test.txt.

这里的字符串表示与e.message大致相同:

>>> e.message
'DELETE https://storage.googleapis.com/storage/v1/b/my-bucket-name/o/test.txt?generation=1579627133414449: $ACCOUNT does not have storage.objects.delete access to my-bucket-name/test.txt.'

如果你想要更多的结构,你可以使用e._response.json():

>>> e._response.json()

    'error': 
        'code': 403,
        'message': '$ACCOUNT does not have storage.objects.delete access to my-bucket-name/test.txt/test.txt.',
        'errors': [
            'message': '$ACCOUNT does not have storage.objects.delete access to my-bucket-name/test.txt/test.txt.',
            'domain': 'global',
            'reason': 'forbidden'
        ]
    

【讨论】:

以上是关于如何访问 Python google.cloud.storage 上传方法中的错误原因?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 运行时云函数访问 Google Cloud Platform Firestore 触发器

如何将 google-api-client 用于 Google Cloud Logging

如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证

无法从Vagrant访问Google Cloud SDK for Python的本地开发服务器

在 Google Cloud Build 中使用 python 插件编译 protobuf 消息

如何使用 Google Speech API 访问 Google Cloud Storage 中的文件?