腾讯云函数 python_腾讯云函数SCF使用心得
腾讯云函数SCF使用心得
雁陎 • 2020 年 07 月 25 日
Loading...
## 前言
Python部署一直是我比较头疼的事,一些PHP制作的API速度也不太理想(受限于服务器),后来突然想起不是有云函数这种东西吗,然后就打算尝试一下看怎么样,这里记录一下我的心得。
我们直接选腾讯云了,因为它的界面操作什么的都比较友好,阿里云过于复杂,我试了一下还是放弃了……
## 部署一个随机图片API
以喜闻乐见的随机图API为例,熟悉云函数的使用方法。
首先,注册一个腾讯云账号,然后打开[云函数](https://console.cloud.tencent.com/scf/),在 `函数服务`中点击 `新建`,函数名随便取,我这里就填 `randompic`了。


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

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

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

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

代码如下:
```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;
}
?>
```
完成后,点一下代码下方的 `保存并测试`,返回结果成功显示出一条连接,说明代码无误。

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

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


但,这仍不是我们想要的,我们希望访问链接直接给出图片而非链接。遗憾的是,这种效果我也不知道怎么实现,查看了腾讯给的几个模板,包括返回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倍!不知道是代码问题还是程序本身问题……

## 绑定域名
云函数的使用界面以及相关的帮助文档都没提到绑定域名这回事,我还以为没有这个功能,后来发了工单才知道原来是在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网关。

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

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

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

版权属于:雁陎
本文链接:https://www.sitstars.com/archives/97/
转载时须注明出处及本声明
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)