这个学期做了个小东西,一个每日一言的小程序后台,现在跑在自己的服务器上。

—— 为什么想做

起因挺简单:想做个每天推一句话的小程序,自己用着玩,顺便练练手。

功能想得不多:每天给用户一句,能随机翻,能生成个海报图发出去。

—— 用的什么

后端是 Flask,之前写"妙手"的时候用过,比较熟。配 gunicorn 跑,开了 3 个 worker,只监听 127.0.0.1 的 8000 端口,外面通过 nginx 转进来。

数据存 SQLite。就这点数据量,上 MySQL 反而麻烦,一个 .db 文件拷走就能备份。

句子是从一个 json 里攒的,现在有 516 条,写了个脚本同步进数据库。

—— 写了哪些接口

最后大概是这样:

接口 作用
/api/quote/today 今天的句子
/api/quote/random 随机来一句
/api/quota 查配额
/api/poster 生成海报图
/api/quotes/categories 分类列表
/api/stats 上报统计
/api/qrcode 生成小程序码
/health 健康检查

后台管理单独放了 admin 开头的几个接口,用来增删改句子、看数据。

—— 碰到的问题

配额。 一开始没限制,后来觉得不太行 —— 接口是对外的,万一被人刷就麻烦了。加了个按用户计次的配额,超了就拒绝。现在 quotas 表里没几条记录,量不大,但机制是通的。

微信的接口。 生成小程序码要先拿 access_token,这玩意有有效期,得缓存起来,不能每次都去要。这块调的时候卡了一下,因为报错信息不太友好,看半天才知道是 token 过期。

部署。 第一次把 Flask 项目往服务器上放,踩了不少坑:虚拟环境怎么建、gunicorn 的启动参数、systemd 服务怎么写、nginx 怎么转发。后来干脆写了个 install.sh,把这些步骤都固化下来,下次重装能省事。

—— 现在

它现在就跑在我那台服务器上,和博客共用一台机器,但各自独立 —— 博客是 Java,这个是 Python,各走各的端口,互不干扰。

做下来的感觉是:想法很简单,但真要让它稳定跑着,要考虑的东西比写接口多得多。配额、缓存、日志、进程挂了要能自己起来,这些不上线根本不会遇到。

不过看着自己写的东西真在跑,还是挺有成就感的。