[英]Application context errors when locally testing a (Python) Google Cloud Function
[英]Testing Google Cloud PubSub push endpoints locally
试图找出在本地测试 PubSub 推送端点的最佳方法。 我们尝试使用 ngrok.io,但您必须拥有该域才能列入白名单(这样做的工具也已损坏……导致无限重定向循环)。 我们还尝试在本地模拟 PubSub。 我可以发布和拉取,但我无法让推送订阅正常工作。 我们正在使用本地 Flask 网络服务器,如下所示:
@app.route('/_ah/push-handlers/events', methods=['POST'])
def handle_message():
print request.json
return jsonify({'ok': 1}), 200
以下不会产生任何结果:
client = pubsub.Client()
topic = client('events')
topic.create()
subscription = topic.subscription('test_push', push_endpoint='http://localhost:5000/_ah/push-handlers/events')
subscription.create()
topic.publish('{"test": 123}')
当我们尝试创建对 HTTP 端点的订阅时,它确实会对我们大喊大叫(而如果您不使用 HTTPS,则实时 PubSub 会这样做)。 也许这是设计使然? Pull 工作得很好……关于如何最好地在本地开发 PubSub 推送端点有什么想法吗?
根据撰写本文时最新的 PubSub 库文档,以下示例使用推送配置创建订阅。
我已经按照以下要求进行了测试:
requirements.txt
):flask==1.1.1
google-cloud-pubsub==1.3.1
export PUBSUB_PROJECT_ID=fake-project
gcloud beta emulators pubsub start --project=$PUBSUB_PROJECT_ID
默认情况下,PubSub 模拟器在端口 8085 上启动。项目参数可以是任何内容,无关紧要。
考虑以下server.py
:
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/_ah/push-handlers/events', methods=['POST'])
def handle_message():
print(request.json)
return jsonify({'ok': 1}), 200
if __name__ == "__main__":
app.run(port=5000)
运行服务器(在端口 5000 上启动):
python server.py
考虑以下pubsub.py
:
import sys
from google.cloud import pubsub_v1
if __name__ == "__main__":
project_id = sys.argv[1]
# 1. create topic (events)
publisher_client = pubsub_v1.PublisherClient()
topic_path = publisher_client.topic_path(project_id, "events")
publisher_client.create_topic(topic_path)
# 2. create subscription (test_push with push_config)
subscriber_client = pubsub_v1.SubscriberClient()
subscription_path = subscriber_client.subscription_path(
project_id, "test_push"
)
subscriber_client.create_subscription(
subscription_path,
topic_path,
push_config={
'push_endpoint': 'http://localhost:5000/_ah/push-handlers/events'
}
)
# 3. publish a test message
publisher_client.publish(
topic_path,
data='{"test": 123}'.encode("utf-8")
)
最后,运行这个脚本:
PUBSUB_EMULATOR_HOST=localhost:8085 \
PUBSUB_PROJECT_ID=fake-project \
python pubsub.py $PUBSUB_PROJECT_ID
然后,您可以在 Flask 服务器的日志中看到结果:
{'subscription': 'projects/fake-project/subscriptions/test_push', 'message': {'data': 'eyJ0ZXN0IjogMTIzfQ==', 'messageId': '1', 'attributes': {}}}
127.0.0.1 - - [22/Mar/2020 12:11:00] "POST /_ah/push-handlers/events HTTP/1.1" 200 -
请注意,您可以检索发送的消息,这里以 base64 ( message.data
) 编码:
$ echo "eyJ0ZXN0IjogMTIzfQ==" | base64 -d
{"test": 123}
当然,你也可以用 Python 进行解码。
我未能让 PubSub 模拟器在我的本地环境中工作(失败并出现各种 java 异常)。 我什至没有尝试使用 auth 推送等各种功能。所以我最终使用ngrok公开我的本地开发服务器,并在 PubSub 订阅中使用来自 ngrok 的公共 https URL。
我对 Q 中描述的白名单和重定向没有任何问题。因此可能对其他人有帮助。
这可能是模拟器中的一个已知错误(即将修复),其中与订阅一起创建的推送端点不起作用。 该错误仅影响初始推送配置; 修改现有订阅的推送配置应该可以工作。 你可以试试吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.