基于 Serverless Framework 的人工智能小程序开发( 五 )

这样会更加便利,同时模拟网关,做一个测试方法:
?复制代码
def test():event = {"requestContext": {"serviceId": "service-f94sy04v","path": "/test/{path}","httpMethod": "POST","requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef","identity": {"secretId": "abdcdxxxxxxxsdfs"},"sourceIp": "14.17.22.34","stage": "release"},"headers": {"Accept-Language": "en-US,en,cn","Accept": "text/html,application/xml,application/json","Host": "service-3ei3tii4-251000691.ap-guangzhou.apigateway.myqloud.com","User-Agent": "User Agent String"},"body": json.dumps({"wechat": "12345","nickname": "test","remark": "",}),"pathParameters": {"path": "value"},"queryStringParameters": {"foo": "bar"},"headerParameters": {"Refer": "10.0.2.14"},"stageVariables": {"stage": "release"},"path": "/test/value","queryString": {"foo": "bar","bob": "alice"},"httpMethod": "POST"}print(main_handler(event, None))增加本地测试时,指定test()方法:
?复制代码
if __name__ == "__main__":test()这样,线上触发时会默认执行main_handler, 而本地执行,则会通过test走入main_handler,我们可以边开发,边测试,全部弄好之后再部署到线上 。
线上获取配置信息是通过获取环境变量,本地又该如何执行?我们需要先进行这个操作:
?复制代码
# -*- coding: utf8 -*- import yamlimport osdef setEnv():file = open("/Users/dfounderliu/Documents/code/AIAlbum/serverless.yaml", 'r', encoding="utf-8")file_data = https://www.isolves.com/it/ai/2020-07-24/file.read()file.close()data = yaml.load(file_data)for eveKey, eveValue in data['Conf']['inputs'].items():print(eveKey, eveValue)os.environ[eveKey] = str(eveValue) 这样,我们这个文件就既可以线上直接用,也可以本地直接用了!
那么,Yaml 怎么写?

基于 Serverless Framework 的人工智能小程序开发

文章插图
 
然后,我们可以在部署函数的时候将公共组件引入项目中 。
本地形式:
基于 Serverless Framework 的人工智能小程序开发

文章插图
 
线上形式:
基于 Serverless Framework 的人工智能小程序开发

文章插图
 
项目部署
  • 在使用之前,需要先有一个腾讯云的账号,并且开通了 COS、COS、APIGW 以及 CDB 等相关产品权限;
  • 将项目 clone 到本地,配置自己的密钥信息、数据库信息 。配置文件在cloudFunction目录下的serverless.yaml中:
?复制代码
# 函数们的整体配置信息Conf:component: "serverless-global"inputs:region: ap-shanghairuntime: Python3.6handler: index.main_handlerinclude_common: ./commonmysql_host: gz-c************************.commysql_user: rootmysql_password: S************************!mysql_port: 6************************0mysql_db: albummini_program_app_id: asdsa************************ddddmini_program_app_secret: fd340c4************************8744eetencent_secret_id: AKID1y************************l1q0kKtencent_secret_key: cCoJ************************FZj5Oatencent_appid: 1256773370cos_bucket: 'album-1256773370'domain: album.0duzahn.com由于我目前使用的是 Serverless Components,没有全局变量等,所以在此处增加了全局变量组件,在这里设置好全局变量,在之后的 Components 中可以直接引用,例如:
?复制代码
# 创建存储桶CosBucket:component: '@serverless/tencent-website'inputs:code:src: ./cosregion:${Conf.region}bucketName: ${Conf.cos_bucket}