在本地测试 Python Google Cloud Functions
Posted
技术标签:
【中文标题】在本地测试 Python Google Cloud Functions【英文标题】:Test Python Google Cloud Functions locally 【发布时间】:2019-05-10 15:55:42 【问题描述】:我正在 Google Cloud Functions 上试用 Python3.7 运行时。我能够部署这些功能并在部署后使它们工作,但是,我似乎无法在部署之前运行模拟器在本地测试它们。
Google 的文档有些不一致,他们告诉您在此处安装 google 函数模拟器:https://cloud.google.com/functions/docs/emulator
但在 Firebase 上,他们会告诉您 npm install
firebase-admin、firebase-tools 和 firebase-functions。
所有的模拟器文档都引用了用 JS 编写的示例,没有使用 Python,所以我想知道这些模拟器是否甚至在本地运行 Python 函数?
谢谢
【问题讨论】:
我从不使用模拟器。在桌面上运行 Cloud Functions 代码非常容易。模拟入口点只需要 Json 数据。这允许您完全访问使用您的调试器、编辑器和普通的旧打印语句等。 【参考方案1】:更新
请使用来自 GCP https://github.com/GoogleCloudPlatform/functions-framework-python 的官方模拟器和服务框架
你可以安装它
pip install functions-framework
已弃用
根据达斯汀的回答,我开发了一个包来充当模拟器:
pip install gcp-functions-emulator
假设您想提供以下功能
# mycloudfunction.py
def api(request):
return 'important data'
为了模拟,我们必须这样称呼它:
gcpfemu <path/to/file.py> <function_name>
例如,使用上面的代码,我们将调用它:
gcpfemu mycloudfunction.py api
为了访问我们可以使用的数据,例如 curl:
curl localhost:5000/api
> important data
【讨论】:
能否提供 Github 项目链接?这是我想贡献的一种项目。 @SayanSil gitlab.com/divisadero/cloud-functions-python-emulator 没错@SurajSubramanian。但是我建议使用官方的 Google Functions Emulator 而不是这个。 Divisadero 不再维护这个谷歌模拟器之前的版本 当然@dinigo,我会尝试使用官方模拟器。谢谢^^【参考方案2】:您可以使用Functions Framework for Python在本地运行该函数。
给定一个名为 main.py
的文件中的函数,如下所示:
def my_function(request):
return 'Hello World'
你可以这样做:
$ pip install functions-framework
$ functions-framework --target my_function
这将在http://localhost:8080 启动本地开发服务器。
为 HTTP 函数在本地调用它:
$ curl http://localhost:8080
对于具有非二进制数据的后台函数:
$ curl -d '"data": "hi": "there"' -X POST \
-H "Content-Type: application/json" \
http://localhost:8080
对于具有二进制数据的后台函数:
$ curl -d "@binary_file.file" -X POST \
-H "Ce-Type: true" \
-H "Ce-Specversion: true" \
-H "Ce-Source: true" \
-H "Ce-Id: true" \
-H "Content-Type: application/json" \
http://localhost:8080
【讨论】:
如果您尝试模拟路径行为,它将不起作用 @DavidMabodo 你能详细点吗? “模拟路径行为”是什么意思? 发布/订阅消息?我可以效仿吗? @Hsn 我在回答中添加了一些示例。 @Hsn 试试上面的“使用非二进制数据的后台函数”示例。您作为 JSON 请求正文提供的data
的值最终成为 event
参数,context
参数由框架创建。【参考方案3】:
在 GitHub 上查看此项目:GoogleCloudPlatform/functions-framework
目前只有Node.js、Go 和php 中的实现,但请参阅Issue #5 关于Python 实现。
我建议,无论你使用什么实现,都遵循Functions Framework Contract
更新: 正如 Dustin 所说,现在还有一个 Python 实现。
【讨论】:
Functions Framework for Python 现在存在,我已经相应地更新了我的答案。【参考方案4】:要在 IntelliJ 中使用 Target Type = Script Path
和默认选项运行它,它应该如下所示:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello():
return hello_get(request)
if __name__ == '__main__':
app.run('127.0.0.1', debug=True)
【讨论】:
以上是关于在本地测试 Python Google Cloud Functions的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到本地 Google Cloud Datastore 模拟器
无法从Vagrant访问Google Cloud SDK for Python的本地开发服务器
使用 Python,将 google.cloud.bigquery.job.query.QueryJob 输出保存到本地 JSON 文件