Vercel Serverless 与 Flask 体验

tech

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

前段时间有个小应用要部署上线,倒也不复杂:接口收到前端请求之后返回一张动态生成的图片就行。

由于 没有服务器只能白嫖 想要体验世界上最流行、先进的 Serverless 函数计算,正好博客部署在 Vercel,所以看了看 Vercel 的官方 Documentation,发现他们也可以部署一些函数计算,支持的语言有:

  • Node.js
  • Go
  • Python
  • Ruby

我对 Python 比较熟悉,于是就顺手用 Flask 写了一个服务;部署时候遇到了一些坑,在这里记录一下。

和其他专门提供 Lambda 计算的云厂商不一样,Vercel 这个 Serverless 有点像是 “顺便” 做的;根据官方文档,如果我们需要部署服务,只需要创建一个 api 文件夹,然后把自己的服务文件放进去就好。

但如果我们直接把文件扔上去,就会发现什么都跑不了;要是想让我们的服务正常运行,还需要避开以下几个坑。

坑 0x01 - 依赖安装

除了 Python 开箱即用的包,我们的服务经常还会用到些其他的第三方库;就像我的服务中就用到了 Pillow/Flask 库;要想让 Vercel 提供我们需要的环境,就需要用依赖描述文件告诉它我们需要的第三方库。

方法倒也不复杂:在根目录创建一个 requirements.txt 文件即可:

1
2
Flask>=1.1.2
Pillow>=8.1.2

坑 0x02 - 引出服务

当服务部署起来之后,还需要在 vercel.json 中将这个路径 Rewrite 到服务文件里;这里假设我们的服务文件名叫做 api.py,那么在 vercel.json 中需要这样写:

1
2
3
4
5
6
"rewrites": [
{
"source": "/api/(.*)",
"destination": "/api/api.py"
}
]

但是最坑爹的是,这个在这个 JSON 文件中如果使用了我在上篇文件中介绍的 routes 属性,那么添加 rewrites 属性就会编译报错。

没有办法,我只能照着那坑爹的文档尝试着慢慢把之前的路由属性改成使用重定向 redirects 属性:如果我们想要实现跳转,可以在配置文件中这样写:

1
2
3
4
5
6
7
"redirects": [
{
"source": "/privacy/",
"destination": "/announcement",
"permanent": false
}
]

坑 0x03 - 服务路径与尾斜杠

这个是真的坑,在 Documentation 中没有写,但确实是折磨了我一会儿:

API 中服务的路径就是对外访问的路径!

就是说,如果服务相对外提供路径:/api/function,那么 Flask 中需要绑定的路由路径就是:

1
@app.route("/api/function/", methods=["GET"])

为什么这个路径后面有一个尾斜杠呢?因为如果对于 api 目录下提供的服务来说,/api/function/api/function/ 是两个路径(真的烦)

如果我们想要实现自动添加/去除尾斜杠,那么可以在 vercel.json 中添加这个配置:

1
"trailingSlash": true

而这个配置将会影响到全局,在同一个 Project 中部署所有文件都会受它影响;所以如果想我一样也部署了 Hexo 之类的其他服务,可能还需要调整其他的目录配置。


在避开上面的一些坑之后就可以部署静态文件,实现简单的前后端分离,使用我们刚刚的 API;静态文件还会被 Hexo 进行编译,如果想要禁止还需要在 _config.yml 中配置跳过。

等年中如果有时间了我想看看是不是能在上面写一个简单的 Proxy,方便梯子抽风的时候凑活使用;毕竟现在的网络环境越来越差了。

Author: 桂小方

Permalink: https://init.blog/vercel-serverless-flask/

文章许可协议:

如果你觉得文章对你有帮助,可以 支持我

Comments