11.4. 开发 Python 功能
使用 Python 的 OpenShift Serverless 功能只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
创建 PythonG 功能项目后,您可以修改提供的模板文件,以将业务逻辑添加到您的功能中。这包括配置功能调用和返回的标头和状态代码。
11.4.1. 先决条件
- 在开发功能前,您必须完成 配置 OpenShift Serverless 功能 中的步骤。
11.4.2. Python 功能模板结构
使用 Knative (kn
) CLI 创建 Python 功能时,项目目录类似于典型的 Python 项目。Python 功能的限制非常少。唯一的要求是项目包含一个 func.py
文件,其中包含一个 main ()
函数,以及一个 func.yaml
配置文件。
开发人员不限于模板 requirements.txt
文件中提供的依赖项。可以像在任何其他 Python 项目中一样添加其他依赖项。为部署构建项目时,这些依赖项将包含在创建的运行时容器镜像中。
http
和 event
触发器功能具有相同的模板结构:
模板结构
fn ├── func.py 1 ├── func.yaml 2 ├── requirements.txt 3 └── test_func.py 4
11.4.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
11.4.4. Python 功能返回值
功能可以返回 Flask 支持的任何值。这是因为调用框架将这些值直接代理到 Flask 服务器。
示例
def main(context: Context): body = { "message": "Howdy!" } headers = { "content-type": "application/json" } return body, 200, headers
功能可以将标头和响应代码设置为从函数调用的次要和第三响应值。
11.4.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_source
和 event_type
decorator 属性都是可选的。
11.4.5. 测试 Python 功能
您可以在计算机上本地测试 Python 功能。default 项目包含一个 test_func.py
文件,它为函数提供了一个简单的单元测试。
Python 功能的默认测试框架是 unittest
。如果您愿意,可以使用不同的测试框架。
先决条件
要在本地运行 Python 功能测试,您必须安装所需的依赖项:
$ pip install -r requirements.txt
流程
-
导航到包含
test_func.py
文件的函数的文件夹。 运行测试:
$ python3 test_func.py