本人前端,在学校学过点PHP,用原生PHP写过接口,写了很多重复代码。后尝试学习thinkPHP,没学下去。
之后接触了Python,感觉Python语法还挺简洁的,又看了看Python的后端框架,选中了flask,或许flask不是主流,但管他呢,自己用的舒服就行了。
flask或许确实有点小众了,网上没多少教程,很多东西还是得靠自己摸索。我为了学习规范一点的代码,跑到Gitee上找一些成熟的项目看源码。
一路摸索过来踩了无数雷,所以想留下一点教程帮助后来的人吧。
部署flask项目网上其实也有一些教程,我也尝试过很多不同的方法,主要就是两种方法:
uWSGI
或gunicorn
启动项目,这里使用的就是这种方法。宝塔的一键部署我也试过(毕竟是懒人,能一键部署谁不想试试呢~)。不过要说的是,体验极差,极不推荐。一键部署虽然简单安逸,但bug极多,而且没有log,宝塔的log只在项目启动的时候有输出,项目运行后就消无声息了,这意味着一旦报错连报错提示都没有。更别说一些莫名其妙的bug,我尝试了很久最后还是放弃了。不过bug只是暂时的,但愿宝塔能越做越好,让每个用户都能真正地一键部署吧。
所以这里是教大家,使用一种尽可能 简单便捷、少报错、方便管理 的方式部署flask项目。所以各位懒人,如果真的想少花点时间,少花点精力,建议使用以下看起来有点复杂方法,千万不要轻易尝试宝塔一键部署。
我用的是pycharm2021.3.1,最好使用比较新的版本,老版本不支持一键生成flask项目,SSH也是较新版本才有的功能。
tools
->Deployment
->Configuration
安全
里看到:/tmp/pycharn_project_30
tools
->Deployment
->Upload to ...
更新当前打开文件的代码Upload All Opened Files to ...
是更新所有文件将项目上传到服务器后,由于服务器没有Python的环境,所以通过以下方式为服务器安装环境。
settings
->project
add
,在弹出来的窗口左边选ssh
,填写服务器公网IP和端口,点Next
这里可以不应用,在这里为服务器安装Python版本和插件就行了,安装了Python后在服务器也可以使用pip安装插件,但大概率会出现报错,而且无法更新到最新版本(亲身经历)。在这里可以轻松地安装和管理插件。
点击左上角的加号
安装插件。
上方输入插件名,就会显示插件的最新版本,一键安装
这里会显示当前版本和最新版本,三角箭头表示可以升级。
其实配置好服务器环境后,可以在项目根目录下启动终端,像在本地运行项目一样输入python app.py
启动项目,但会打印一个警告:
这是一个开发服务器。不要在生产部署中使用它
。目前有两大独立WSGI容器,uWSGI 和 gunicorn
这里只讲如何使用gunicorn,感兴趣的可以看看这篇文章:https://zhuanlan.zhihu.com/p/50857407
pip install gunicorn
安装完成可以使用-h
命令查看帮助
gunicorn -h
gunicorn 启动文件名:flask实例名
app = Flask(__name__)
所以我这里是:
gunicorn app:app
127.0.0.1
也就是本地,我试了一下运行后,访问不了。也就需要手动改一下配置。有两种方法,个人感觉都挺扯淡的。-b host:port
gunicorn -b 123.456.7.8:5000 app:app
这样就直接运行了,下次运行还得重新输入host:port
gunicorn_config.py
,其实名字随便取,然后在文件内输入私网ip地址加端口,注意端口号要在安全组放行。bind = '123.0.2.3:8000'
更多的配置可以看这篇文章:
https://blog.csdn.net/u012856866/article/details/119384985
注意一定要是私网ip,不能使用公网,不知道私网可以看控制台,这里是阿里云的控制台
然后就可以输入命令,让gunicorn根据配置文件启动gunicorn -c 文件名.py 启动文件名:实例名
:
gunicorn -c gunicorn_config.py app:app
而然,每次启动都还是要敲一遍文件名,(为什么不能让配置永远生效!!!),所以我建议各位,配置文件名越短越好,比如gun.py
、conf.py
、a.py
... 简短的名字能一定程度上少敲一点代码。
如果运行后一直重复连接,可以换个端口,注意安全组要放行,配置要使用私网ip,访问要使用公网ip,其他应该没什么要注意的了。
这样就是ip无效或端口未放行导致连接不上:
最终运行成功效果:
成功运行后关闭cmd窗口会杀掉进程(我的不会杀进程,但是接口依然不能使用)。
所以要想办法让进程在后台运行,命令如下:
gunicorn -b post.py app:app --daemon
只要在后面加一个--daemon
就可以了,这段命令运行后是没有任何提示的,不过可以通过以下命令查看正在运行的进程:
sudo lsof -iTCP -sTCP:LISTEN -P | grep gunicorn
可以看到在gunicorn -b post.py app:app --daemon
输入后虽然没有任何提示,但是会有进程被生成,命令已经生效了,如果想要关闭可以运行以下命令:
sudo kill -9 【进程号】
ps: 百度到的命令都是奇奇怪怪而且没有用,甚至有一段命令nohup
还是啥,运行后没有啥子用的同时进程号还是动态的,没法用命令关闭,害得我只能重启服务器。。。
谢谢大家