
# 使用华为云SDK开发Python函数示例
华为云[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/FunctionGraph/sdk?api=InvokeFunction)工具提供各云服务的API参考文档及配套SDK代码示例。
本章节以"获取函数列表"接口为例指导您使用华为云SDK，在函数工作流控制台开发Python函数。
 #### 步骤一：创建函数委托
1. 登录[统一身份认证服务（IAM）控制台](https://console.huaweicloud.com/iam/)。
2. 左侧导航栏选择"权限管理 \> 权限"，单击"创建自定义策略"。
3. 以配置"获取函数列表"接口的相关委托为例，如[图1]所示配置包含获取函数列表权限的自定义策略，单击"确定"完成自定义策略创建。
   关于权限的更多说明请参考[权限基本概念](https://support.huaweicloud.com/usermanual-iam/iam_01_0602.html)。
   图1获取函数列表自定义策略   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002518369857.png "点击放大")
   
   
4. 返回IAM控制台首页，在左侧导航栏选择"委托"，单击右上方的"创建委托"。
5. 配置委托参数，完成参数配置后如[图2]所示，单击"完成"，系统弹出"创建成功"提示，单击"立即授权"。
   图2填写基本信息   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002486009984.png "点击放大")
   
   
6. 在"选择策略"界面，选择[3](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0800.html#functiongraph_02_0800__li126397354368)创建的自定义策略，单击"下一步"，其他参数请根据实际需求选择，完成委托授权。
 
 #### 步骤二：创建Python函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，右上角单击"创建函数"。
2. 创建一个空白的Python事件函数，"委托"选择[步骤一：创建函数委托]中创建的委托，建议选择较新的运行时版本，单击"创建函数"进入函数详情页。
3. 在"代码"页签，下拉至"代码依赖包"模块，单击"添加依赖包"。
4. 如[图3]所示，"依赖包源"选择"私有依赖包"，单击"创建依赖包"进入依赖包创建界面。
   图3选择依赖包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002378533298.png "点击放大")
   
   
5. 请参考[华为云Python SDK](https://console.huaweicloud.com/apiexplorer/#/sdkcenter/FunctionGraph?lang=Python)和[创建函数依赖包](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_2119.html#section4)为函数创建所需的Python依赖包。
   请注意，创建Python依赖包时需选择与Python函数相同的运行时版本。
   
6. 完成依赖包创建后，回到[4]添加已创建的依赖包。
 
#### 步骤三：通过APIE获取SDK代码示例
1. 打开[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/FunctionGraph/sdk?api=InvokeFunction)，如[图4]所示选择所需的接口，单击"代码示例"页签，选择"Python"语言。
   
   图4APIE代码示例   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002378536148.png "点击放大")
   
   1. 此处以"获取函数列表"为例，选择接口。
   
   2. 填写接口所需的参数，参数描述可参考API参考手册中的相应章节，本例可参考[获取函数列表API](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0105.html)。
   
   3. 复制APIE生成的代码，粘贴在[步骤二：创建Python函数]函数的代码编辑框中。
   
   
   
   
2. 示例代码中的AK/SK信息建议[配置在函数的环境变量](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0154.html)中，并在代码中使用context.getUserData(string key)方法获取。
   
   改写后的代码内容如下：
   ```
   # -*- coding:utf-8 -*-
   import json
   import os
   from huaweicloudsdkcore.auth.credentials import BasicCredentials
   from huaweicloudsdkfunctiongraph.v2.region.functiongraph_region import FunctionGraphRegion
   from huaweicloudsdkcore.exceptions import exceptions
   from huaweicloudsdkfunctiongraph.v2 import *
   def handler (event, context):
       ak = context.getUserData("AK")
       sk = context.getUserData("SK")
       projectId = "project_id"
       credentials = BasicCredentials(ak, sk, projectId)
       client = FunctionGraphClient.new_builder() \
           .with_credentials(credentials) \
           .with_region(FunctionGraphRegion.value_of("cn-north-4")) \
           .build()
       try:
           request = ListFunctionsRequest()
           request.marker = "marker"
           request.maxitems = "maxitems"
           request.package_name = "package_name"
           request.func_name = "func_name"
           response = client.list_functions(request)
           print(response)
       except exceptions.ClientRequestException as e:
           print(e.status_code)
           print(e.request_id)
           print(e.error_code)
           print(e.error_msg)
       return {
           "statusCode": 200,
           "isBase64Encoded": False,
           "body": json.dumps(event),
           "headers": {
               "Content-Type": "application/json"
           }
       }
   ```
   
   
3. （可选）如需使用更安全的鉴权方式，可将以下代码内容替换： 
   ```
   ak = context.getUserData("AK")
   sk = context.getUserData("SK")
   credentials = BasicCredentials(ak, sk, projectId)
   ```
   替换为：
   ```
   ak = context.getSecurityAccessKey()
   sk = context.getSecuritySecretKey()
   st = context.getSecurityToken()
   credentials = BasicCredentials(ak, sk, projectId).with_security_token(st)
   ```
   
   
 
