请求处理程序(Handler)

您可以使用Python请求处理程序响应接收到的事件并执行相应的业务逻辑。本文介绍Python请求处理程序的相关概念、结构特点和示例。

什么是请求处理程序

FC函数的请求处理程序,是函数代码中处理请求的方法。当您的FC函数被调用时,函数计算会运行您提供的Handler方法处理请求。您可以通过函数计算控制台请求处理程序配置Handler。

对Python语言的FC函数而言,您的请求处理程序格式为文件名.方法名。例如,您的文件名为main.py,方法名为handler,则请求处理程序为main.handler

关于FC函数的具体定义和相关操作,请参见创建事件函数

请求处理程序的具体配置均需符合函数计算平台的配置规范。配置规范因请求处理程序类型而异。

Handler签名

一个简单的Handler签名定义如下。

def handler(event, context):
    return 'hello world'

Handler示例解析如下:

  • handler:方法名称。与函数计算控制台配置的请求处理程序相对应。例如,为FC函数配置的handler为main.handler,那么函数计算会去加载main.py中定义的handler函数,并从handler函数开始执行。

  • event:您调用函数时传入的参数。在Python 2.7运行环境中,类型为String。在Python 3运行环境中,类型为Bytes。

  • context:为您的FC函数调用提供在调用时的运行上下文信息。

说明

如您需要通过HTTP触发器或自定义域名访问函数,请先获取请求结构体再自定义HTTP响应。更多信息,请参见HTTP触发器调用函数

示例一:解析JSON格式参数

代码示例

当你传入JSON格式参数时,函数计算会透传参数内容,需要您在代码中自行解析。下面是解析JSON格式事件的代码示例。

# -*- coding: utf-8 -*-
import json
def handler(event, context):
    evt = json.loads(event)
    return evt['key']

前提条件

创建事件函数

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码

    重要

    上述示例代码中函数的请求处理程序是index.py中的handler方法。如果您的函数的请求处理程序配置与此不同,请更新对应的文件名和方法。

  4. 代码页签,单击测试函数右侧的down图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定

    {
      "key": "value"
    }
  5. 单击测试函数

    函数执行成功后,查看返回结果,您可以看到返回结果为value

示例二:通过临时密钥安全读写OSS的资源

python3.12示例代码

python3.12移除了上下文中的credentials字段,可以使用ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRETALIBABA_CLOUD_SECURITY_TOKEN环境变量访问对象存储OSS,代码示例如下所示。更多请见:创建获取AccessKey获取扮演角色的临时身份凭证

import json
import oss2

def handler(event, context):
    evt = json.loads(event)
    auth = oss2.StsAuth(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
    bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
    bucket.put_object(evt['objectName'], evt['message'])
    return 'success'

python3.10示例代码

您可以使用函数计算为您提供的临时密钥访问对象存储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. 在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码

    重要

    上述示例代码中函数的请求处理程序是index.py中的handler方法。如果您的函数的请求处理程序配置与此不同,请更新对应的文件名和方法。

  4. 代码页签,单击测试函数右侧的down图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定

    {
      "endpoint": "http://oss-cn-shenzhen-internal.aliyuncs.com",
      "bucket": "oss-********",
      "objectName": "oss-test-object",
      "message": "oss-test-content"
    }
  5. 单击测试函数

    函数执行成功后,查看返回结果,您可以看到返回结果为success

示例三:调用外部命令

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

import os
import subprocess

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

示例四:使用HTTP触发器调用函数

示例代码

关于HTTP触发调用的请求负载格式和响应负载格式,请参见HTTP触发器调用函数

# -*- coding: utf-8 -*-
import logging
import json
import base64

def handler(event, context):
    logger = logging.getLogger()
    logger.info("receive event: %s", event)

    try:
        event_json = json.loads(event)
    except:
        return "The request did not come from an HTTP Trigger because the event is not a json string, event: {}".format(event)
    
    if "body" not in event_json:
        return "The request did not come from an HTTP Trigger because the event does not include the 'body' field, event: {}".format(event)
    req_body = event_json['body']
    if 'isBase64Encoded' in event_json and event_json['isBase64Encoded']:
        req_body = base64.b64decode(event_json['body']).decode("utf-8")

    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'text/plain'},
        'isBase64Encoded': False,
        'body': req_body
    }

前提条件

已使用上述示例创建运行环境为Python的函数,并创建HTTP触发器。具体操作,请参见创建事件函数配置HTTP触发器并使用HTTP触发

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数详情页面,单击触发器管理页签,获取HTTP触发器的公网访问地址。

  4. 在Curl工具执行以下命令,调用函数。

    curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'

    以上命令中,https://test-python-ipgrwr****.cn-shanghai.fcapp.run为获取到的HTTP触发器公网访问地址。

    重要
    • 如果HTTP触发器的认证方式无需认证,您可以直接使用Postman或Curl工具来调用函数。具体操作,请参见本文操作步骤

    • 如果HTTP触发器的认证方式签名认证JWT认证,请使用签名方式或JWT认证方式来调用函数。具体操作,请参见认证鉴权

    响应结果如下。

    HTTP/1.1 200 OK
    Content-Disposition: attachment
    Content-Length: 12
    Content-Type: application/json
    X-Fc-Request-Id: 1-64f7449a-127fbe39cd7681596e33ebad
    Date: Tue, 05 Sep 2023 15:09:14 GMT
    
    Hello fc3.0

错误分析

本示例代码支持使用HTTP触发器或者自定义域名调用。如果使用API调用,但配置的测试参数不符合HTTP触发器请求格式规范时,会出现报错。

例如,在控制台上调用函数,配置请求参数为"Hello, FC!",单击测试函数,收到的响应如下所示。

The request did not come from an HTTP Trigger, event: "Hello, FC!"