腾讯云函数 python_腾讯云函数SCF使用心得

腾讯云函数SCF使用心得

雁陎 • 2020 年 07 月 25 日

Loading...

## 前言

Python部署一直是我比较头疼的事,一些PHP制作的API速度也不太理想(受限于服务器),后来突然想起不是有云函数这种东西吗,然后就打算尝试一下看怎么样,这里记录一下我的心得。

我们直接选腾讯云了,因为它的界面操作什么的都比较友好,阿里云过于复杂,我试了一下还是放弃了……

## 部署一个随机图片API

以喜闻乐见的随机图API为例,熟悉云函数的使用方法。

首先,注册一个腾讯云账号,然后打开[云函数](https://console.cloud.tencent.com/scf/),在 `函数服务`中点击 `新建`,函数名随便取,我这里就填 `randompic`了。

![](https://i.yanshu.work/image/5f1b73e37d104.jpg)

![](https://i.yanshu.work/image/5f1b73e5c7b5e.jpg)

点击 `下一步`,就进入了主要程序设计,描述什么的都不用改。执行方法的意思,是调用云函数时,会执行 `index.php`中的 `main_handler`函数,这个也不用改。

![](https://i.yanshu.work/image/5f1b73e7ba201.jpg)

往下拉,是代码与文件主界面,这个先不急着改,提一点,云函数执行后,返回的只有 `return`的内容,`echo`、`print`什么的统统不会在浏览器中显示。

![](https://i.yanshu.work/image/5f1b73e9d52b5.jpg)

最后是高级设置,这个也默认就好,当然如果你需要,也可以增加最大内存使用或超时时间。

![](https://i.yanshu.work/image/5f1b73ebafa2c.jpg)

最后点击完成,一个云函数服务就创建完毕了。

然后点进去你刚刚创建的服务,编写相应的代码,这里我先创建了一个 `acg.txt`文件,然后把图片链接按行复制到文件中以便读取。

![](https://i.yanshu.work/image/5f1b73edb9803.jpg)

代码如下:

```php

function main_handler($event, $context) {

$pics = [];

$fs = fopen(__DIR__."/acg.txt", "r");

while(!feof($fs)){

$line=trim(fgets($fs));

if($line!=''){

array_push($pics, $line);

}

}

//从数组随机获取链接

$pic = $pics[array_rand($pics)];

return $pic;

}

?>

```

完成后,点一下代码下方的 `保存并测试`,返回结果成功显示出一条连接,说明代码无误。

![](https://i.yanshu.work/image/5f1b73efb691a.jpg)

OK,这样一个简单的随机图API做好了,接下来要定义触发方式,在右侧菜单栏中找到 `触发管理`,创建一个触发器,触发方式选择 `API网关触发器`,其他默认即可。

![](https://i.yanshu.work/image/5f1b73f206642.jpg)

然后就会生成一条测试连接,点击下面的访问路径,你就可以看到返回结果啦。

![](https://i.yanshu.work/image/5f1b73f3e0937.jpg)

![](https://i.yanshu.work/image/5f1b73f5c0f66.jpg)

但,这仍不是我们想要的,我们希望访问链接直接给出图片而非链接。遗憾的是,这种效果我也不知道怎么实现,查看了腾讯给的几个模板,包括返回web界面什么的,最终返回的都是一堆代码。我思来想去,或许只能曲线救国,通过在服务器上创建一个php文件,调用这个API来实现了……

> 如果有大佬知道怎么做的,欢迎评论区留言

代码如下:

```php

$json = file_get_contents('https://service-qb9jcbjd-1256293391.sh.apigw.tencentcs.com/release/randompic');

$arr = json_decode($json,true);

header("Location:$arr");

?>

```

## Python版本

整完php版本的随机图后,我突然发现自己陷入了一个思维误区,我为什么非要用php,而不选更为熟悉的python呢。然后我又写了一个python版的随机图,代码如下:

```python

# -*- coding: utf8 -*-

import random

def main_handler(event, context):

with open('acg.txt','rb') as handler:

lines = handler.readlines()

result = random.choice(lines).decode('utf-8').strip('\n\r')

#print(result)

return result

```

这里有两个地方需要注意,一是读取的内容是 `bytes`类型,不能直接返回,需要加个 `.decode('utf-8')`将其转为str,另外读取时会带有回车换行符,也需要手动去掉。

测试后发现,python版占用的内存居然只需要10m,比php整整少了5倍!不知道是代码问题还是程序本身问题……

![](https://i.yanshu.work/image/5f1b73f7855fa.jpg)

## 绑定域名

云函数的使用界面以及相关的帮助文档都没提到绑定域名这回事,我还以为没有这个功能,后来发了工单才知道原来是在API网关中实现的,具体参考文档见:[https://cloud.tencent.com/document/product/628/11791](https://cloud.tencent.com/document/product/628/11791)

首先你需要一个备案过的域名,然后打开[API网关](https://console.cloud.tencent.com/apigateway/index?rid=1),在 `服务`中找到你想绑定的API网关。

![](https://i.yanshu.work/image/5f1b73f910352.jpg)

比如我的 `yanshu`,点进去,找到 `自定义域名`,点击 `新建`

![](https://i.yanshu.work/image/5f1b73fba0697.jpg)

然后去域名控制台添加相应的CHAME记录,后面的的相信大家都懂。(PS:想要添加HTTPS的同学可以点击证书下面的 `点此前往`,然后购买一个免费的证书部署即可)

![](https://i.yanshu.work/image/5f1b73fd33f46.jpg)

我吐了,写完几个函数后发现API网关绑定域名必须在腾讯云备案,算了,老老实实用阿里云了

**0728更新**:

后来我又尝试了百度云,使用起来也挺简单的,不过节点比较少,国内只有三个。至于绑定域名,同样用API网关间接进行,百度云的API网关功能好像更多一些,不过其他功能暂时不在我的考虑范围内。最重要的是,文档上说API网关的运行逻辑与函数计算一样,但是做了一个简单的hello world程序没法正确返回。我以为是我哪里操作失误了,提交工单后才知道,原来是系统本身的问题……不知道是不是用的人少,我发工单后才解决这个bug,现在已经能愉快使用了。

哦对了,暂时来说,百度云的API网关绑定域名,不需要在百度云备案,这点还是不错的。

![](https://i.yanshu.work/image/5f1f98a0b10f0.jpg)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值