小白也能用heroku发布免费app

土豆炒青椒
·
(修改过)
·
IPFS
全程免费,记下步骤,避免搞忘

自娱自乐搞了个发票找信息程序。利用python nltk和tessertact OCR自动找出日期,金额,类别等信息。再也不用人工录入了。

虽然算法简单,准确率也不算高,但觉得还是需要弄个免费app……


1 工具准备

GitHub账号
Heroku账号(5个免费小app)
VS Code
Postman


2 看教程,装环境

因为需要用到nltk,所以自动考虑用flask做后端。貌似今年5月flask推出了2.0,于是就自动安装2.0了。

几年前玩过flask 1.0,再部署到heroku,但是早忘光了。磨刀不误砍柴工,所以还是先看看教程磨磨刀。

2.1 热身视频推荐:

https://www.youtube.com/watch?v=nCMB5p74WJQ&t=1293s

2021年5月发布,还很新鲜。从flask到vue,基础知识点全复习了。


2.2 检查环境

安装flask之前,有三个必备安装:brew,python3,pip。我省事,用最简单的brew😎。

开动之前,记得检查一下:

brew --version
python3 --version
pip --version


3 开动前,记得安装pyenv

pyenv方便指定所需python版本。使用Heroku发布app,对python版本有精确要求,错一个数字就会发布失败。pyenv 可以指定项目的python版本(别把生命浪费在版本兼容上……),五星级推荐值得拥有。

3.1 安装pyenv步骤:

brew install pyenv
echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
source ~/.bash_profile


3.2 创建项目

完成pyenv安装后,正式创建项目文件夹:

mrdir <app-name>

最新的heroku stacks 20,指定python版本为3.9.6,所以在项目文件内的python版本需要为3.9.6。

如果安装了3.9.5,发布时就会失败。

https://devcenter.heroku.com/articles/python-support - heroku对python版本说明

进入项目,安装项目所需python环境

cd <app-name>
pyenv local 3.9.6

3.9.6就是本项目需要指定的python版本。pyenv local命令指定项目文件夹内部的python版本,有别于pyenv global命令。


3.3 检查python有没有按照指定版本安装到所需项目:

在项目文件夹内运行:

python --version

在项目文件夹外运行:

cd ..
python --version

得到的版本号应该是不一样的。


4 安装flask环境

确认项目python版本为heroku官方指定版本后,终于可以安装flask了。。。。

4.1 安装flask

pip install Flask


4.2 创建虚拟环境

在步骤3创建的项目文件夹内运行:

python -m venv venv

运行完毕后,刚才空白的项目文件夹下会多出一个venv文件夹,那就是运行flask需要的虚拟环境。


4.3 安装完成后不要忘了激活它

Mac OS激活

$ . venv/bin/activate


参考flask installation 教程,和flask quickstart,一个简易flask 小app就跑起来了😎。

……

然后我们根据需要,做我们想要的flask app。

【Tip】这个过程可能需要用到debug模式:

export FLASK_ENV=development
flask run

……

……

……


5 准备发布heroku之前,还有很多准备工作……

当小小app在本地跑顺畅后,我们准备发布app到heroku。发布之前步骤超多……

5.1 安装heroku cli

早晚会用到的。

brew tap heroku/brew && brew install heroku


5.2 根目录创建runtime小文件

runtime小文件说明heroku小app需要的python环境。没错,和3.2 pyenv安装的python版本一致。

touch runtime.txt
echo “python-3.9.6” >> runtime.txt


5.3 根目录创建Procfile小文件

web档次的Procfile长这样就好:

web: gunicorn app:app

所以为了我们的app可以在heroku上跑起来,还需要安装一下gunicorn

pip install gunicorn


5.4 根目录创建requirements小文件

requirments小文件列下flask小app用到的所有包:

gunicorn==19.10.0
pandas==1.3.1
Flask==2.0.1
Flask_Cors==3.0.10
numpy==1.21.1
nltk==3.6.2
Pillow==8.3.1
pytesseract==0.3.8

我的flask小app用了这些包,需要把它们一个不漏根据版本号列出来。做app的过程,应该预料不到自己需要用到什么包。应该都是边做边测试,跑顺了再总结吧……

touch requirements.txt
pip freeze > requirements.txt




以上折腾完毕heroku发布python小app的基本步骤。每个小app用到包不一样,还需要对阵下药,增加额外部署步骤。

小app中涉及nltk和pytesseract两个包,需要额外步骤。。。。。。

6 nltk额外步骤

nltk是一个自然语言处理包。我的小app用了nltk的数据,所以我还需要一个nltk小文件,让heroku去nltk data下载app需要的数据

6.1 在项目根目录创建nltk小文件

touch nltk.txt


6.2 在nltk小文件中声明项目所需加载数据

我的小app需要下载以下内容,需要在nlkt.txt中声明

stopwords
punkt
averaged_perceptron_tagger

nltk小文件的额外步骤,和5.4 requirements的额外步骤类似,不算太槽。


7 pytesseract额外步骤

pytesseract帮我实现图片自动转文字功能,也需要额外安装。。。。。。

7.1 在根目录创建Aptfile文件

touch Aptfile


7.2 在Aptfile内声明使用的语言。

英语声明案例如下:

tesseract-ocr
tesseract-ocr-eng


7.3 添加buildpacks

Aptfile创建好后,我们需要在heroku添加Buildpacks。还记得我们之前安装过的heroku cli吗?现在派上用场了……

pytesseract需要的buildpacks命令如下:

heroku buildpacks:add heroku/python
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-apt
heroku buildpacks:add https://github.com/pathwaysmedical/heroku-buildpack-tesseract

完了之后再添加TESSDATA_PREFIX:

heroku config:set TESSDATA_PREFIX=/app/.apt/usr/share/tesseract-ocr/4.00/tessdata

/app/……是指向tessdata的路径,如果你不知道tessdata在heroku app什么地方的话,可以通过heroku bash查看:

heroku run bash
find -iname tessdata


【Tip】添加buildpacks的另一种方式

添加buildpacks和tessdata路径,可以通过herolu cli完成,也可以在heroku账户对应app下的setting栏目下设置……

两种办法,个人喜欢哪种用哪种

……





折腾完以上7大步骤,终于可以把app上传GitHub,再heroku一键部署了……

然鹅,实际操作过程中,一定会遇上无数次错误和失败的。我一共失败了20次,才成功。以下是我在实际操作过程中遇到的槽点总结:

失败1 版本环境匹配

Python版本没有匹配heroku官方指定版

刚开始发布时,不知道heroku对python版本要求如此严格,就失败了。于是退回来用pyenv重新安装环境


失败2 Procfile参数设置

Procfile貌似bug挺多的,我在这个环节上失败了10次……解决方案除了看官方说明外,就是找Google网友答案。折腾折腾还是折腾好了……


失败3 诡异玄学

tessdata安装,失败5次。

环境版本配置完成build成功后,满心欢喜查看app,结果浏览器返回Application error

build成功不代表app可以在浏览器查看。。。

这个时候需要调出log,查找错误。

heroku logs --tail --app <app-name>

但是在折腾tessdata安装的问题上,我已经对照官方说明安装了一切,依然诡异地得到这样的error:

127, 'tesseract: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory'

Google一个哥们说用stacks 18弄,就好了。看到这里,我崩溃了——从3.1 pyenv步骤起,我一直就是按照stacks 20折腾的。从晚上7点折腾到11点,最后一刻功亏一篑;看看时间,我决定还是去睡觉为好。

睡醒过后第二天,我又用heroku logs查看了一下错误,竟然没有了。赶紧重新发布一次,然后神奇地可以用了!!!!!!

苦尽甘来,最后一个错误在睡完一觉后,没做任何改动自己消失了!!!!!!




总结完部署过程中不断和error斗智斗勇的经验,也总结一下部署过程中的便捷经验:

省事1 Mac OS

以上7大步骤均在省事方便的Mac OS上操作,其他操作系统的步骤可能会略有不一样,但Mac OS肯定是最简单的。

不要把生命浪费在折腾操作系统上,用Mac海阔天空😎。


省事2 heroku cli

heroku cli使用基本便捷,有问题对着heroku dev center 查找各个击破就好。

过程靠谱,安一个不亏。

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!