
# 开发Python事件函数
Python的事件函数开发，支持本地开发后上传代码文件，也支持直接在FunctionGraph控制台创建函数在线编辑Python函数代码。
关于Python函数的接口定义以及SDK接口说明请参考[Python函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0502.html)。
#### 约束与限制
- 函数仅支持返回如下几种类型的值：
  - None：函数返回的HTTP响应Body为空。
  
  - String：函数返回的HTTP响应Body内容为该字符串内容。
  
  - 其他：当函数返回值的类型不为None和String时，函数会将返回值作为对象进行json编码，并将编码后的内容作为HTTP响应的Body，同时设置响应的"Content-Type"头为"application/json"。
   
- 通过APIG服务调用函数服务时，isBase64Encoded的值默认为true，表示APIG传递给FunctionGraph的请求体body已经进行Base64编码，需要先对body内容Base64解码后再处理。
  函数必须按以下结构返回字符串。
  ```
  {
      "isBase64Encoded": true|false,
      "statusCode": httpStatusCode,
      "headers": {"headerName":"headerValue",...},
      "body": "..."
  }
  ```
  
- 用Python运行时语言编写代码时，自行创建的包名不能与Python标准库同名，否则会提示module加载失败。例如"json"、"lib"、"os"等。
 
 #### 步骤一：创建Python函数工程
1. 编写打印helloworld的代码。 打开文本编辑器，编写helloworld函数，代码如下，文件命名为helloworld.py，保存文件。
   ```
   def print hello():
       print('Hello world!')
   ```
   
2. 定义FunctionGraph函数。 打开文本编辑器，如下所示编写函数代码，文件命名为index.py，保存文件（与helloworld.py保存在同一文件夹下）。
   ```
   # -*- coding:utf-8 -*-
   import json
   import helloworld
   def handler (event, context):
       output =json.dumps(event)
       helloworld.printhello()
       return output
   ```
   
3. 工程打包。 函数工程创建以后，可以得到以下目录，选中工程所有文件，打包命名为"fss_examples_python3.zip"，如[图1]所示。打包时请确保解压后，入口函数所在的文件位于根目录。
   您也可以直接下载打包好的[Python函数样例工程包](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0101.html#functiongraph_02_0101__section3825924414326)使用。
   图1打包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000001257264599.png "点击放大") 
 
#### 步骤二：创建FunctionGraph函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，右上角单击"创建函数"。
2. 如[图2]所示，创建一个空白的Python事件函数，单击"立即创建"进入函数详情页。
   图2创建Python函数   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002335621086.png "点击放大")
   
   
3. 如[图3]所示，在"代码"页签上传[步骤一：创建Python函数工程]打包的Zip文件。
   上传的代码将在函数工作流控制台自动部署，如修改代码，请再次单击"部署代码"。
   图3上传Zip文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002394826741.png "点击放大")
   
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   **修改函数执行入口：**
   在FunctionGraph控制台左侧导航栏选择"函数 \> 函数列表"，单击需要设置的"函数名称"进入函数详情页，选择"设置 \> 常规设置"，配置"函数执行入口"参数，如[图4]所示。
   图4函数执行入口   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002369420857.png "点击放大")
   - 函数执行入口中的index：与[步骤一：创建Python函数工程]中定义FunctionGraph函数的文件名保持一致，通过该名称找到FunctionGraph函数所在文件。
   
   - 函数执行入口中的handler：为函数代码中的执行函数名，通过该名称找到函数的执行入口。
   
   
   函数执行过程为：上传fss_examples_python3.zip保存在OBS中，触发函数后，解压缩zip文件，通过index匹配到FunctionGraph函数所在文件，通过handler匹配到index.py文件中定义的FunctionGraph函数，找到执行入口，执行函数。
   
 
#### 步骤三：测试函数
1. 在"代码"页签下，单击"测试"，弹出"配置测试事件"弹窗，选择"空白模板"，如[图5]所示配置测试事件"test"，单击"创建"。
   图5配置测试事件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002360874544.png "点击放大") 
2. 选择已配置的测试事件"test"，单击"测试"。
3. 如[图6]所示，右侧出现"执行结果"窗口，可测试函数是否执行成功。
   图6测试结果   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002361034704.png "点击放大") 
 
#### 函数执行结果
执行结果由3部分组成：函数返回、执行摘要和日志。
表1执行结果说明 
| 参数项  | 执行成功                          | 执行失败                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|
| 函数返回 | 返回函数中定义的返回信息。                 | 返回包含错误信息、错误类型和堆栈异常报错信息的JSON文件。格式如下： ``` { "errorMessage": "", "errorType": "", "stackTrace": [] } ``` errorMessage：Runtime返回的错误信息 errorType：错误类型 stackTrace：Runtime返回的堆栈异常报错信息 |
| 执行摘要 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。                                                                                                                                                                                                                                                                      |
| 日志   | 打印函数日志，最多显示4KB的日志。            | 打印报错信息，最多显示4KB的日志。                                                                                                                                                                                                                                                                                 |
   
#### 相关文档
- 制作Python运行时的函数依赖包，可参考[为Python函数制作依赖包](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0616.html)。
- 关于函数开发的更多说明，如函数支持的运行时、函数支持的触发事件、函数工程打包规范以及如何在函数中引入动态链接库，请参见[函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0100.html)。
 
