业务代码的编写都在函数计算里,本示例代码需包含三段逻辑,详解图解:

创建一个函数,包含以下三段逻辑的代码并定义函数入口,完成后运行调试:
说明
编写业务代码时需要注意:
  1. 函数计算的python运行环境缺省带了表格存储产品的SDK,所以不需要额外再安装。
  2. 注意Python的书写格式,编辑器目前还无法校验语法错误。
  • 第一段逻辑为接收表格存储的数据,详细的代码样例可以参考 详细文档
    #!/usr/bin/env python
    # coding=utf-8
    import sys
    import cbor
    import json
    import tablestore as ots
    import time
    from mns.account import Account
    from mns.queue import *
    
    def get_attrbute_value(record, column):
        attrs = record[u'Columns']
        for x in attrs:
            if x[u'ColumnName'] == column:
                return x['Value']
    def get_pk_value(record, column):
        attrs = record[u'PrimaryKey']
        for x in attrs:
            if x['ColumnName'] == column:
                return x['Value']
  • 第二段逻辑为把数据回写到表格存储中,详细的代码样例如下:
    
    #表存储实例 
    INSTANCE_NAME = 'sample-test'
    #表存储实例所在区域
    REGION = 'cn-hangzhou'
    ENDPOINT = 'http://%s.%s.ots-internal.aliyuncs.com'%(INSTANCE_NAME, REGION)
    #个人accid,可在控制台头像下方查找
    ACCID="************" 
    #个人acckey,可在控制台头像下方查找
    ACCIDKEY="**********************
    def _utf8(input):
    return str(bytearray(input, "utf-8"))
    
    
    def get_ots_client(context):
    creds = context.credentials
    client = ots.OTSClient(ENDPOINT, ACCID, ACCIDKEY, INSTANCE_NAME, sts_token = creds.securityToken)
    return client 
    
    def save_to_ots(client, record):
    id = int(get_pk_value(record, 'TB_sample'))
    level = int(get_attrbute_value(record, 'level'))
    msg = get_attrbute_value(record, 'message')
    
    pk = [(_utf8('TB_sample'), TB_sample),]
    attr = [(_utf8('level'), level), (_utf8('message'), _utf8(msg)),]
    row = ots.Row(pk, attr)
    client.put_row(_utf8('log_result'), row)
    return attr;
  • 第三段逻辑为把数据通知消息通道,示例代码如下:
    #init my_account, my_queue
    def get_my_queue(context):
    #在消息队列控制台中获取公网endpoint
        endpoint ="http(s)://*************mns.cn-hangzhou.aliyuncs.com/"
    	#个人accid
        accid="************"
    	#个人acckey
        acckey="***********************"
        token=""
        my_account = Account(endpoint, accid, acckey, token)
        queue_name = "sample-test"
        my_queue = my_account.get_queue(queue_name)
        return my_queue
    
    def send_msg_to_mns(msg,context):
        my_queue = get_my_queue(context)
        re_msg = my_queue.send_message(Message(msg))
        print "Send Message Succeed! MessageBody:%s" % (msg)
  • 定义函数入口:
    def handler(event, context):
        #测试时请从json中加载	
        #records = cbor.loads(event)
        records = json.loads(event)
        client = get_ots_client(context)
        for record in records['Records']:
            level = int(get_attrbute_value(record, 'level'))
            if level > 1:
                attr= save_to_ots(client, record)
                send_msg_to_mns(attr,context)  
                print attr
            else:
               msg="no  need to notify"
               send_msg_to_mns(msg,context)
            print msg
    说明
    • 使用“触发器”检查函数返回值:“触发器”可以进行输入值的调试,可以模拟输入值通过程序运行后返回什么样的值。
    • 正式编写业务代码的时候,将records= json.loads(event)代码前加上“#”,注释掉此行代码,同时将#records = cbor.loads(event) 的“#”去掉。