6.7. 开发 Python 功能

重要

使用 Python 的 OpenShift Serverless 功能只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

创建 PythonG 功能项目后,您可以修改提供的模板文件,以将业务逻辑添加到您的功能中。这包括配置功能调用和返回的标头和状态代码。

6.7.1. 先决条件

6.7.2. Python 功能模板结构

使用 Knative (kn) CLI 创建 Python 功能时,项目目录类似于典型的 Python 项目。Python 功能的限制非常少。唯一的要求是项目包含一个 func.py 文件,其中包含一个 main () 函数,以及一个 func.yaml 配置文件。

开发人员不限于模板 requirements.txt 文件中提供的依赖项。可以像在任何其他 Python 项目中一样添加其他依赖项。为部署构建项目时,这些依赖项将包含在创建的运行时容器镜像中。

httpevent 触发器功能具有相同的模板结构:

模板结构

fn
├── func.py 1
├── func.yaml 2
├── requirements.txt 3
└── test_func.py 4

1
包含 main () 函数。
2
用于确定镜像名称和 registry。
3
与在任何其他 Python 项目中一样,可以向 requirements.txt 文件中添加其他依赖项。
4
包含一个简单的单元测试,可用于在本地测试您的功能。

6.7.3. 关于调用 Python 功能

Python 功能可以通过简单的 HTTP 请求调用。收到传入请求后,将通过 上下文 对象作为第一个参数来调用函数。

上下文 对象是一个 Python 类,具有两个属性:

  • request 属性始终存在,包含 Flask 请求(request) 对象。
  • 如果传入请求是 CloudEvent 对象,则第二个属性 cloud_event 会被填充。

开发人员可以从上下文对象访问任何 CloudEvent 数据。

上下文对象示例

def main(context: Context):
    """
    The context parameter contains the Flask request object and any
    CloudEvent received with the request.
    """
    print(f"Method: {context.request.method}")
    print(f"Event data {context.cloud_event.data}")
    # ... business logic here

6.7.4. Python 功能返回值

功能可以返回 Flask 支持的任何值。这是因为调用框架将这些值直接代理到 Flask 服务器。

示例

def main(context: Context):
    body = { "message": "Howdy!" }
    headers = { "content-type": "application/json" }
    return body, 200, headers

功能可以将标头和响应代码设置为从函数调用的次要和第三响应值。

6.7.4.1. 返回 CloudEvents

开发人员可以使用 @event decorator 告知调用器,在发送响应前,函数返回值必须转换为 CloudEvent。

示例

@event("event_source"="/my/function", "event_type"="my.type")
def main(context):
    # business logic here
    data = do_something()
    # more data processing
    return data

这个示例发送 CloudEvent 作为响应值,类型为 "my.type",源是 "/my/function"。CloudEvent data属性设置为返回的 data 变量。event_sourceevent_type decorator 属性都是可选的。

6.7.5. 测试 Python 功能

您可以在计算机上本地测试 Python 功能。default 项目包含一个 test_func.py 文件,它为函数提供了一个简单的单元测试。

注意

Python 功能的默认测试框架是 unittest。如果您愿意,可以使用不同的测试框架。

先决条件

  • 要在本地运行 Python 功能测试,您必须安装所需的依赖项:

    $ pip install -r requirements.txt

流程

  1. 导航到包含 test_func.py 文件的函数的文件夹。
  2. 运行测试:

    $ python3 test_func.py

6.7.6. 后续步骤