开始前的逼逼赖赖:
本人前端,在学校学过点PHP,用原生PHP写过接口,写了很多重复代码。后尝试学习thinkPHP,没学下去。
之后接触了Python,感觉Python语法还挺简洁的,又看了看Python的后端框架,选中了flask,或许flask不是主流,但管他呢,自己用的舒服就行了。
flask或许确实有点小众了,网上没多少教程,很多东西还是得靠自己摸索。我为了学习规范一点的代码,跑到Gitee上找一些成熟的项目看源码。
一路摸索过来踩了无数雷,所以想留下一点教程帮助后来的人吧。
正文:
部署flask项目网上其实也有一些教程,我也尝试过很多不同的方法,主要就是两种方法:
-
常规方法,把项目搬到服务器上,安装环境,使用
uWSGI
或gunicorn
启动项目,这里使用的就是这种方法。 - 懒人方法,把项目搬到服务器上,生成环境配置清单文件,使用宝塔的Python项目管理器一键部署。
宝塔的一键部署我也试过(毕竟是懒人,能一键部署谁不想试试呢~)。不过要说的是,体验极差,极不推荐。一键部署虽然简单安逸,但bug极多,而且没有log,宝塔的log只在项目启动的时候有输出,项目运行后就消无声息了,这意味着一旦报错连报错提示都没有。更别说一些莫名其妙的bug,我尝试了很久最后还是放弃了。不过bug只是暂时的,但愿宝塔能越做越好,让每个用户都能真正地一键部署吧。
所以这里是教大家,使用一种尽可能 简单便捷、少报错、方便管理 的方式部署flask项目。所以各位懒人,如果真的想少花点时间,少花点精力,建议使用以下看起来有点复杂方法,千万不要轻易尝试宝塔一键部署。
首先要同步代码到云端,这里使用Pycharm同步代码
我用的是pycharm2021.3.1,最好使用比较新的版本,老版本不支持一键生成flask项目,SSH也是较新版本才有的功能。
-
点击
tools
->Deployment
->Configuration
- 配置服务器的公网ip,端口号一般是22,可以在宝塔的
安全
里看到:
-
再配置项目在服务器中的位置,以下配置项目将更新到该指定路径
/tmp/pycharn_project_30
-
配置好后可以点击菜单
tools
->Deployment
->Upload to ...
更新当前打开文件的代码
Upload All Opened Files to ...
是更新所有文件
配置云端的Python环境
将项目上传到服务器后,由于服务器没有Python的环境,所以通过以下方式为服务器安装环境。
- 点击
settings
->project
-
点击Python版本右边的设置按钮,点
add
,在弹出来的窗口左边选ssh
,填写服务器公网IP和端口,点Next
-
配置好后变成这样:
这里可以不应用,在这里为服务器安装Python版本和插件就行了,安装了Python后在服务器也可以使用pip安装插件,但大概率会出现报错,而且无法更新到最新版本(亲身经历)。在这里可以轻松地安装和管理插件。
-
点击左上角的
加号
安装插件。
-
上方输入插件名,就会显示插件的最新版本,一键安装
-
这里会显示当前版本和最新版本,三角箭头表示可以升级。
配置好服务器环境后,就要运行项目了
其实配置好服务器环境后,可以在项目根目录下启动终端,像在本地运行项目一样输入python app.py
启动项目,但会打印一个警告:
翻译过来就是
这是一个开发服务器。不要在生产部署中使用它
。百度之后,说说我的理解:
flask本身的服务器容器性能非常弱,记住是非常,只能在本地开发用用,不推荐在生产环境下使用,注意这只是个警告而不是报错,实际还可以用用。我自己测试过,代码写一点简单的逻辑还可以用,稍微复杂一点,验证了一下token就芭比Q了,直接报超时。所以还是非常有必要使用第三方的容器提升一下性能的。
目前有两大独立WSGI容器,uWSGI 和 gunicorn
这里只讲如何使用gunicorn,感兴趣的可以看看这篇文章:https://zhuanlan.zhihu.com/p/50857407
使用gunicorn运行flask项目
-
首先打开终端安装gunicorn
老配方
pip install gunicorn
安装完成可以使用-h
命令查看帮助
gunicorn -h
-
直接运行项目
gunicorn 启动文件名:flask实例名
此处app:app中,第一个app为flask项目实例所在的包(就是启动文件app.py),第二个app为生成的flask项目实例(就是你app.py里定义的flask实例)。
flask实例:
app = Flask(__name__)
所以我这里是:
gunicorn app:app
- gunicorn默认的host是
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
还是啥,运行后没有啥子用的同时进程号还是动态的,没法用命令关闭,害得我只能重启服务器。。。
至此项目运行成功,圆满结束
谢谢大家