本文介紹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