官方文档中对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是一个可以根据具体需求高度自由化定制的参数,真的可以为所欲为: