在本地测试 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 文件

使用 Google Cloud SDK 设置本地环境

将 python 对象上传到 Google Cloud Storage 而不将其保存到文件

Google Cloud Storage:如何在 Python 中(递归)删除文件夹