TL;DR -App Engine 标准不支持较新的Google Cloud 客户端库。您将需要使用较旧的Google Cloud API 客户端库与Cloud Pub/Sub进行通信。
Cloud API 客户端库(较旧)与 Google Cloud 客户端库(较新)
您指向的Cloud Pub/Sub 客户端库文档建议您使用较旧的Google API 客户端库(App Engine 标准环境支持)而不是Google Cloud 客户端库(App Engine 灵活环境支持但不支持标准)
客户端库在此处详细说明。
适用于 Cloud Pub/Sub 的 Google API 客户端库
以下是使用 Google API 客户端库支持的所有API 列表。Cloud Pub/Sub API也是此列表的一部分。
将 Google API 客户端库与 App Engine Standard 结合使用
如果您向下滚动该页面,则会有一节描述如何在 App Engine 标准环境中使用此 API 库。简而言之,您需要将库与您的应用程序捆绑在一起,就像您使用的其他第三方库一样。
应用引擎
由于 Python 客户端库未安装在App Engine Python 运行时环境中,因此它们必须像第三方库一样供应到您的应用程序中。
您将在页面上看到的此警告建议您尽可能使用常规的云客户端库。但由于 App Engine Standard 不支持它,您可以在该用例中忽略它。
虽然仍然支持此库,但我们建议尝试使用更新的 Cloud Client Library for Google Cloud Pub/Sub,尤其是对于新项目。有关安装和使用详情,请参阅Google Cloud Pub/Sub 库。
使用 google-api-python-client 库调用 PubSub API 的示例
使用服务帐户 json 文件中的凭据
以下示例向您展示了如何使用服务帐号向 Google Cloud PubSub API 进行身份验证并调用它们。有关如何使用服务帐户中的凭据的信息可在此处获得。
您需要预先安装以下 python 包才能使此示例正常工作:google-api-python-client
和oauth2client
.
如果您正在使用pip
,您可以执行以下操作:
pip install google-api-python-client oauth2client
我亲自测试过的例子:
from googleapiclient import discovery
from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
# BEGIN CONFIG
PRIVATE_KEY_JSON = 'path/to/service_account_private_key.json'
API_SCOPES = ['https://www.googleapis.com/auth/pubsub']
PROJECT_NAME = 'FILL_IN_PROJECT_NAME_HERE'
# END CONFIG
# The format of project name expected by PubSub
PROJECT = 'projects/{0}'.format(PROJECT_NAME)
# Create a ServiceAccountCredentials object by reading the credentials from
# your JSON file.
credentials = ServiceAccountCredentials.from_json_keyfile_name(
PRIVATE_KEY_JSON, scopes=API_SCOPES)
# Build the Cloud PubSub API object which you will be using for
# invoking the corresponding APIs using the credentials object
# you created previously
pubsub = discovery.build('pubsub', 'v1', credentials=credentials)
# List all topics the specified project
topics = pubsub.projects().topics().list(
project=PROJECT).execute()
print topics
# Add a new topic
topic_name = 'TOPIC_NAME_TO_ADD'
added_topic_response = pubsub.projects().topics().create(
name='{0}/topics/{1}'.format(PROJECT, topic_name), body={}).execute()
print added_topic_response
在 App Engine 应用中使用来自服务帐户的凭据
这里有一些关于如何使用 App Engine 应用程序中的服务帐户凭据的信息。
上面的示例大部分都适用于调用 PubSub API,但您将初始化凭证对象的部分除外。该部分可以大致如下所述进行更换:
服务帐号
如果您的 App Engine 应用程序需要调用 API 来访问应用程序项目拥有的数据,您可以使用服务帐户来简化 OAuth 2.0 。这些服务器到服务器的交互不涉及用户,只有您的应用程序需要对其自身进行身份验证。使用AppAssertionCredentials类创建 Credentials 对象,而不使用 Flow 对象。
在以下代码片段中,创建了一个 Credentials 对象并授权了一个 Http 对象:
import httplib2
from google.appengine.api import memcache
from oauth2client.contrib.appengine import AppAssertionCredentials
...
credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/devstorage.read_write')
http = credentials.authorize(httplib2.Http(memcache))
pubsub = discovery.build('pubsub', 'v1', http=http)
...
一旦你有一个授权的 Http 对象,你可以像往常一样将它传递给
build()或execute()函数。
使用应用程序默认凭据
您还可以使用应用程序默认凭据进行本地测试,也可以在 App Engine 环境中工作。
from oauth2client.client import GoogleCredentials
...
credentials = GoogleCredentials.get_application_default()
pubsub = discovery.build('pubsub', 'v1', credentials=credentials)
...