Gra*_*lor 5 python google-authentication google-oauth airflow google-cloud-composer
我希望能够在通过云编辑器运行 python 代码时访问谷歌表上的数据;在本地运行代码时,我知道如何以多种方式执行此操作,但事实证明,迁移到云具有挑战性。特别是我希望作为作曲家服务帐户进行身份验证,而不是将 client_secret.json 文件的内容藏在某处(源代码或某个云位置)。
对于本质上相同的问题,而是访问 google 云平台服务,由于google-cloud_* 库,这相对容易(即使通过 composer 运行)。例如,我已经验证我可以将数据推送到 bigquery:
from google.cloud import bigquery
client = bigquery.Client()
client.project='test project'
dataset_id = 'test dataset'
table_id = 'test table'
dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)
rows_to_insert = [{'some_column':'test string'}]
errors = client.insert_rows(table,rows_to_insert)
Run Code Online (Sandbox Code Playgroud)
可以通过与 Composer 服务帐户共享(或不共享)“测试数据集”来管理此操作的成功或失败。
同样,从云存储桶中获取数据也能正常工作:
from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket('test bucket')
name = 'test.txt'
data_blob = bucket.get_blob(name)
data_pre = data_blob.download_as_string()
Run Code Online (Sandbox Code Playgroud)
我再次能够通过 IAM 控制访问。
然而,为了使用谷歌表格,我似乎必须求助于谷歌 APIs python 客户端,在这里我遇到了困难。关于此的大多数文档(这似乎是一个移动的目标!)假设本地代码执行,从 client_secret.json 文件示例 1、示例 2的创建和存储开始,我在本地理解但对共享文件没有意义具有源代码控制的云环境。所以,我尝试了几种方法:
尝试使用发现和 oauth2 构建凭据
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client.contrib import gce
SAMPLE_SPREADSHEET_ID = 'key for test sheet'
SAMPLE_RANGE_NAME = 'test range'
creds = gce.AppAssertionCredentials(scope='https://www.googleapis.com/auth/spreadsheets')
service = build('sheets', 'v4', http = creds.authorize(Http()))
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
range=SAMPLE_RANGE_NAME).execute()
values = result.get('values', [])
Run Code Online (Sandbox Code Playgroud)
警告:我对使用作用域通过 Http 创建凭证对象一无所知。但这似乎最接近工作:我收到 HTTP403 错误
“请求的身份验证范围不足。”
但是,我不知道这是否意味着我成功地将自己显示为服务帐户,然后被认为不适合访问(因此我需要更多地处理权限);或者实际上并没有那么远(并且需要修复此凭据创建过程)。
使用 google.auth 获取凭证对象并传递给 gspread
我(有限)的理解是 oauth2client 已被弃用,而 google.auth 现在是要走的路。这以与我上面针对云平台服务的成功示例类似的简单方式生成凭证对象,我希望我可以将其传递给 gspread:
import gspread
from google.auth import compute_engine
credentials = compute_engine.Credentials()
client = gspread.authorize(credentials)
Run Code Online (Sandbox Code Playgroud)
可悲的是, gspread 不适用于这些对象,因为它们没有它期望的属性:
AttributeError: 'Credentials' 对象没有属性 'access_token'
这大概是因为 gspread 需要 oauth2 凭据,而那些被 google.auth 剔除的凭据不够兼容。该gspread文档也下去了“先手client_secret文件” ......但据推测,如果我能得到以前(的OAuth / HTTP为基础)的方式来工作,然后我可以使用gspread进行数据检索。但是,就目前而言,这两种方法的混合以相同的方式绊倒:由于身份验证范围不足而导致权限被拒绝的响应。
因此,无论是使用 google.auth、oauth2(假设会持续一段时间)还是其他一些云友好的方法(即不是基于存储密钥的方法),我如何在云作曲家环境中获得合适的凭据调用 Google Sheets API?与 gspread(以及 gspread_dataframe)兼容的方式的奖励标记,但这不是必需的。也很高兴听到这是一个 PEBCAK 错误,我只需要为我当前的工作方法配置不同的 IAM 权限。
您的 Composer 环境oauthScopes配置似乎未正确设置。如果不指定,默认云平台不允许您访问 Google Sheets API。您可能需要使用 oauthScopes = [ " https://www.googleapis.com/auth/spreadsheets ", " https://www.googleapis.com/auth/cloud-platform "]创建一个新的 Composer 环境。
Google 表格 API 参考:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create。
| 归档时间: |
|
| 查看次数: |
1588 次 |
| 最近记录: |