函数计算入口参数event详解-阿里云开发者社区

开发者社区> 阿里云Serverless Compute> 正文
登录阅读全文

函数计算入口参数event详解

简介: 函数计算入口参数event是一个可以根据具体需求高度自由化定制的参数,真的可以为所欲为

官方文档中对event的解释如下:

event是用户调用函数时传入的数据,它可以是一个简单的string,也可以是一个JSON string,还可以是一个图片(二进制数据)。函数中的event参数是个字节流,在Python2.7中是str类型,在Python3中是bytes类型。

用户在函数中可以根据实际情况对event进行转换:

  • 输入数据是一个JSON string的话,用户可以把它转换成一个dict:
# -*- coding: utf-8 -*-
import json
def my_handler(event, context):
    evt = json.loads(event)
    return evt['key']
  • 输入数据是一个文件的bytes, 比如图片的文件作为event参数传入
# -*- coding: utf-8 -*-
from wand.image import Image
def resize(event, context):
    with Image(blob=event) as img:
        with img.clone() as i:
            i.resize(128, 128)
            return i.make_blob()

丰富event参数功能

上面列出的event参数功能都是针对具体的string或者文件bytes的情况,假设用户想在event中同时传送文本字符串和图片、音频、视频等其他文件资源,这个是可行吗?答案是肯定的。
在本教程中,我们以python3 runtime为例,将一张图片作为json的某个filed值传入函数的event参数,先在控制台上创建一个函数如下:

# -*- coding: utf-8 -*- 
import json
from wand.image import Image
import base64

def handler(event, context):
    evt = json.loads(event)
    img_str = evt.get('image_str', "")
    print("handler log:", evt.get('name'))
    image_data = base64.b64decode(img_str)
    if not image_data:
        return
    with Image(blob=image_data) as img:
        with img.clone() as i:
            i.resize(128, 128)
            return i.make_blob()

假设这个函数所在的service名为demo, 函数名字是multimedia, 本地代码:

# coding=utf-8
import fc2
import base64
import json

def get_multimedia_json(img_file):
    json_data = None
    with open(img_file, 'rb') as jpg_file:
        byte_content = jpg_file.read()
        base64_bytes = base64.b64encode(byte_content)
        base64_str = base64_bytes.decode('utf-8')
        raw_data = {
            'name': "multimedia",
            'image_str': base64_str,
        }
        json_data = json.dumps(raw_data)
    return json_data

json_data = get_multimedia_json("test.jpg")

client = fc2.Client(
    endpoint='<your account id>.cn-hangzhou.fc.aliyuncs.com',
    accessKeyID='<your ak id>',
    accessKeySecret='<your ak secret>',
    )

# Invoke function synchronously.
resp = client.invoke_function('demo', 'multimedia', payload=json_data)

with open('output.jpg', 'wb') as jpg_file:
    jpg_file.write(resp.data)

这里假设函数的当前目录有test.jpg图片,执行函数之后,在本地会生成一张test.jpg缩放成128*128大小的图像output.jpg

event是一个可以根据具体需求高度自由化定制的参数,真的可以为所欲为:
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里云Serverless Compute
使用钉钉扫一扫加入圈子
+ 订阅

Serverless微服务应用实践分享

官方博客
函数计算官网