区域 ID
REGION_ID
是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r
包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。
详细了解区域 ID。
Pub/Sub 可在应用之间提供可靠的多对多异步消息传递服务。发布者应用可以向某一主题发送消息,其他应用可以订阅该主题以接收消息。
本文档介绍如何使用 Cloud 客户端库在 Python 应用中发送和接收 Pub/Sub 消息。
前提条件
- 按照 App Engine 上的 Python 版“Hello, World!”中的说明设置您的环境和项目,并了解如何构建 App Engine Python 应用。
- 记下并保存项目 ID,因为您需要用它来运行本文档中所述的示例应用。
克隆示例应用
将示例应用复制到本地机器,然后导航到
pubsub
目录:git clone https://github.com/GoogleCloudPlatform/python-docs-samples cd python-docs-samples/appengine/flexible/pubsub
创建主题和订阅
创建主题和订阅,并指定 Pub/Sub 服务器应该向其发送请求的端点:
gcloud pubsub topics create YOUR_TOPIC_NAME gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic YOUR_TOPIC_NAME \ --push-endpoint \ https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_TOKEN \ --ack-deadline 10
用随机密钥令牌替换
YOUR_TOKEN
。推送端点使用它来验证请求。设置环境变量
修改
app.yaml
文件,为您的项目 ID、主题和验证令牌设置环境变量:代码审核
示例应用使用 Cloud 客户端库。
示例应用使用您在
app.yaml
文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:app.config['PUBSUB_VERIFICATION_TOKEN'] = \ os.environ['PUBSUB_VERIFICATION_TOKEN'] app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']
示例应用维护一个全局列表以存储此实例接收的消息:
MESSAGES = []
pubsub_push()
方法会接收推送的消息并将其添加到MESSAGES
全局列表中:index()
方法与 App Engine Web 应用交互,以发布新消息并显示收到的消息:在本地运行示例
在本地运行时,您可以借助 Google Cloud CLI 提供身份验证以使用 Google Cloud API。假设您按照前提条件中的说明设置了环境,那么您已经运行了
gcloud init
命令,该命令可提供此身份验证。安装依赖项(最好在虚拟环境中)。
Mac OS/Linux
- 创建一个独立的 Python 环境:
python3 -m venv env
source env/bin/activate
- 如果您当前不在包含示例代码的目录中,则导航到包含
hello_world
示例代码的目录。然后安装依赖项:cd YOUR_SAMPLE_CODE_DIR
pip install -r requirements.txt
Windows
使用 Powershell 运行 Python 包。
- 找到已安装的 Powershell。
- 右键点击 Powershell 的快捷方式,并以管理员身份启动。
- 创建一个独立的 Python 环境。
python -m venv env
.\env\Scripts\activate
- 导航到项目目录并安装依赖项。如果您当前不在包含示例代码的目录中,则导航到包含
hello_world
示例代码的目录。然后安装依赖项:cd YOUR_SAMPLE_CODE_DIR
pip install -r requirements.txt
然后在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id] export PUBSUB_VERIFICATION_TOKEN=[your-verification-token] export PUBSUB_TOPIC=[your-topic] python main.py
模拟推送通知
应用可以在本地发送消息,但无法在本地接收推送消息。但是,您可以向本地推送通知端点发送 HTTP 请求来模拟推送消息。该示例包含文件
sample_message.json
。您可以使用
curl
或httpie
客户端发送 HTTPPOST
请求:curl -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
或
http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
响应:
HTTP/1.0 200 OK Content-Length: 2 Content-Type: text/html; charset=utf-8 Date: Mon, 10 Aug 2015 17:52:03 GMT Server: Werkzeug/0.10.4 Python/2.7.10 OK
请求完成后,您可以刷新
localhost:8080
并在收到的消息列表中查看该消息。在 App Engine 上运行
如需使用
gcloud
命令行工具将演示应用部署到 App Engine,请从app.yaml
文件所在的目录运行以下命令:gcloud app deploy
您现在可以通过
https://PROJECT_ID.REGION_ID.r.appspot.com
访问该应用。您可以使用表单提交消息,但无法保证您的哪个应用实例会收到通知。您可以发送多条消息并刷新页面,以查看收到的消息。 - 创建一个独立的 Python 环境: