本文介绍Python事件请求处理程序的结构特点和示例。
Event Handler签名
一个简单的Event Handler签名定义如下。
def handler(event, context):
return 'hello world'
Event Handler的示例解析如下:
handler
:方法名称。与函数计算控制台配置的请求处理程序(函数入口)相对应。例如,为FC函数配置的handler为main.handler
,那么函数计算会去加载main.py
中定义的handler
函数,并从handler
函数开始执行。event
:您调用函数时传入的参数。在Python 2.7运行环境中,类型为String。在Python 3运行环境中,类型为Bytes。context
:为您的FC函数调用提供在调用时的运行上下文信息。
示例一:解析JSON格式参数
代码示例
当你传入JSON格式参数时,函数计算会透传参数内容,需要您在代码中自行解析。下面是解析JSON格式事件的代码示例。
# -*- coding: utf-8 -*-
import json
def handler(event, context):
evt = json.loads(event)
return evt['key']
前提条件
操作步骤
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
- 在函数管理页面,单击目标函数名称。
- 在函数详情页面,单击函数代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码。重要 上述示例代码中函数的请求处理程序是
index.py
中的handler
方法。如果您的函数的请求处理程序配置与此不同,请更新对应的文件名和方法。 - 在函数代码页签,单击测试函数右侧的图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定。
{ "key": "value" }
- 单击测试函数。函数执行成功后,查看返回结果,您可以看到返回结果为
value
。
示例二:通过临时密钥安全读写OSS的资源
示例代码
您可以使用函数计算为您提供的临时密钥访问对象存储OSS,代码示例如下所示。
import json
import oss2
def handler(event, context):
evt = json.loads(event)
creds = context.credentials
# do not forget security_token
auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
bucket.put_object(evt['objectName'], evt['message'])
return 'success'
上述代码示例中的creds = context.credentials
表示从context
参数中获取临时密钥,避免在代码中硬编码密码等敏感信息。
重要 请确保当前所在的服务配置的角色具有访问对象存储OSS的权限。您可以登录RAM控制台,为该角色添加访问对象存储OSS的权限。
前提条件
操作步骤
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
- 在函数管理页面,单击目标函数名称。
- 在函数详情页面,单击函数代码页签,在代码编辑器中输入上述示例代码,然后单击部署函数。重要 上述示例代码中函数的请求处理程序是
index.py
中的handler
方法。如果您的函数的请求处理程序配置与此不同,请更新对应的文件名和方法。 - 在函数代码页签,单击测试函数右侧的图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定。
{ "endpoint": "http://oss-cn-shenzhen-internal.aliyuncs.com", "bucket": "oss-********", "objectName": "oss-test-object", "message": "oss-test-content" }
- 单击测试函数。函数执行成功后,查看返回结果,您可以看到返回结果为
success
。
示例三:调用外部命令
您的Python程序也可以创建fork
进程,调用外部命令。例如,您可以使用subprocess
模块调用Linux的ls -l
命令,输出当前目录下的文件列表。代码示例如下。
import os
import subprocess
def handler(event, context):
ret = subprocess.check_output(['ls', "-l"])
return ret