您可以使用Python請求處理常式響應接收到的事件並執行相應的商務邏輯。本文介紹Python請求處理常式的相關概念、結構特點和樣本。
什麼是請求處理常式
FC函數的請求處理常式,是函數代碼中處理請求的方法。當您的FC函數被調用時,Function Compute會運行您提供的Handler方法處理請求。您可以通過Function Compute控制台的請求處理常式配置Handler。
對Python語言的FC函數而言,您的請求處理常式格式為檔案名稱.方法名
。例如,您的檔案名稱為main.py
,方法名為handler
,則請求處理常式為main.handler
。
關於FC函數的具體定義和相關操作,請參見建立事件函數。
請求處理常式的具體配置均需符合Function Compute平台的配置規範。配置規範因請求處理常式類型而異。
Handler簽名
一個簡單的Handler簽名定義如下。
def handler(event, context):
return 'hello world'
Handler樣本解析如下:
handler
:方法名稱。與Function Compute控制台配置的請求處理常式相對應。例如,為FC函數配置的handler為main.handler
,那麼Function Compute會去載入main.py
中定義的handler
函數,並從handler
函數開始執行。event
:您調用函數時傳入的參數。在Python 2.7運行環境中,類型為String。在Python 3運行環境中,類型為Bytes。context
:為您的FC函數調用提供在調用時的運行上下文資訊。
如您需要通過HTTP觸發器或自訂網域名訪問函數,請先擷取請求結構體再自訂HTTP響應。更多資訊,請參見HTTP觸發器調用函數。
樣本一:解析JSON格式參數
程式碼範例
當你傳入JSON格式參數時,Function Compute會透傳參數內容,需要您在代碼中自行解析。下面是解析JSON格式事件的程式碼範例。
# -*- coding: utf-8 -*-
import json
def handler(event, context):
evt = json.loads(event)
return evt['key']
前提條件
操作步驟
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數配置頁面,選擇代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後單擊部署代碼。
重要上述範例程式碼中函數的請求處理常式是
index.py
中的handler
方法。如果您的函數的請求處理常式配置與此不同,請更新對應的檔案名稱和方法。在代碼頁簽,單擊測試函數右側的表徵圖,從下拉式清單中選擇配置測試參數,輸入如下樣本測試參數,然後單擊確定。
{ "key": "value" }
單擊測試函數。
函數執行成功後,查看返回結果,您可以看到返回結果為
value
。
樣本二:通過臨時密鑰安全讀寫OSS的資源
python3.12範例程式碼
python3.12移除了上下文中的credentials欄位,可以使用ALIBABA_CLOUD_ACCESS_KEY_ID
、ALIBABA_CLOUD_ACCESS_KEY_SECRET
、ALIBABA_CLOUD_SECURITY_TOKEN
環境變數訪問Object Storage Service,程式碼範例如下所示。更多請見:建立擷取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範例程式碼
您可以使用Function Compute為您提供的臨時密鑰訪問Object Storage ServiceOSS,程式碼範例如下所示。
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
參數中擷取臨時密鑰,避免在代碼中寫入程式碼密碼等敏感資訊。
請確保當前所在的服務配置的角色具有訪問Object Storage Service的許可權。您可以登入RAM控制台,為該角色添加訪問Object Storage Service的許可權。
前提條件
操作步驟
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數配置頁面,選擇代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後單擊部署代碼。
重要上述範例程式碼中函數的請求處理常式是
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
樣本四:使用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觸發。
操作步驟
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數詳情頁面,單擊觸發器管理頁簽,擷取HTTP觸發器的公網訪問地址。
在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/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!"