Как получить доступ к причине ошибки в Python методах загрузки google.cloud.storage? - PullRequest
2 голосов
/ 21 января 2020

Я использую пакет 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."

В: Есть ли способ получить доступ к более полезному коду ошибки или необработанному ответу?

Я надеюсь представить пользователю разницу между, например, данными с истекшим сроком действия и попытками сделать то, что ваши учетные данные не позволяют.

1 Ответ

2 голосов
/ 21 января 2020

Какую версию 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'
        }]
    }
}
...