本文介绍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']

前提条件

创建函数

操作步骤

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 函数管理页面,单击目标函数名称。
  5. 函数详情页面,单击函数代码页签,在代码编辑器中输入上述示例代码,然后单击保存并部署
  6. 函数代码页签,单击测试函数右侧的down图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定
    {
      "key": "value"
    }
  7. 单击测试函数
    函数执行成功后,查看返回结果,您可以看到返回结果为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的权限。

前提条件

创建函数

操作步骤

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 函数管理页面,单击目标函数名称。
  5. 函数详情页面,单击函数代码页签,在代码编辑器中输入上述示例代码,然后单击保存并部署
  6. 函数代码页签,单击测试函数右侧的down图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定
    {
      "endpoint": "http://oss-cn-shenzhen.aliyuncs.com",
      "bucket": "oss-********",
      "objectName": "oss-test-object",
      "message": "oss-test-content"
    }
  7. 单击测试函数
    函数执行成功后,查看返回结果,您可以看到返回结果为success

示例三:调用外部命令

您的Python程序也可以创建fork进程,调用外部命令。例如,您可以使用subprocess模块调用Linux的ls -l命令,输出当前目录下的文件列表。代码示例如下:

import os
import subprocess

def handler(event, context):
    ret = subprocess.check_output(['ls', "-l"])
    return ret