如何将Flask项目部署在Ubuntu系统的阿里云主机中(详细完整版:上)
问题的重述
忙了一个月,总算到了这个时刻,终于可以部署一个真正属于自己的web项目了。如果你在看这篇文章,那么请相信我们都是一路人,有很多坑我们都会踩到,也会上网去找解决方案。这篇文章主要是理清了部署web项目的一些思路,解决项目部署前的环境搭建的问题,同时,也排出了一些大家可能遇到的坑。如果你和我一样是新手,本文章将是我们所面临问题的完整的解答!字有点多,是为了面面俱到,所以请耐心阅读,仔细思考……
如果你想在一台网络服务器上配置多个web server,改文章一样适用,第二篇最后关于Nginx的配置会详解;
解决的思路与方案
如果你已经拥有了自己的云服务器,并且现在正打算将自己电脑上的flask项目移植到云服务器上去,那么我下面的思路将会对你有一定的帮助:
总体设计方案
- 本地项目与文件的整理
- 整理好的本地的文件打包上传服务器
- 项目的解包与放到相应目录
- 项目的生产环境搭建(明白项目开发环境与生产环境的概念非常重要,下面会有说明)
- 对uwsgi的配置
- 对Nginx的配置
- 运行项目,浏览器访问无阻,表明大功告成
第一步,项目上传服务器前的准备
python项目开发的必备利器——virtualenv(虚拟环境)
如果你知道virtualenv并且你的项目是在virtualenv里开发的,那你可以跳过下面的几步;如果不是,那么你就非常有必要了解一下这个好用的东西了。
我们在开发不同的项目时,其所需的环境都是不同的,每个项目都需要装很多第三方包,而且有些需要在python2.x的环境,有些需要python3.x的环境;如果开发的项目多了,那么我们系统的python环境岂不被污染的不成样子了,此时virtualenv便能帮我们保持系统的python环境的纯净,而且还特别方便我们的项目的移植与部署呢!这么好用的东西,我们有什么理由不会懂呢!(其实用起来也很简单啦),这里不用我多讲,有人讲得比我的好多了,给大家分享一篇写得极好的文章,一看便了:切记:知道如何使用后立马回来看下面
【http://www.tendcode.com/article/virtualenv-for-python/】把项目移植到自己搭建的虚拟的python环境中
这一步也很简单,可以用自己开发的IDE打开项目,在切换项目的运行幻境,这一步不懂得可自行百度下怎么切换,如果你的IDE是pycharm,可以参考这篇文章:
【https://www.cnblogs.com/IDRI/p/6354237.html】
切记:要保证装包前要进入指定的虚拟环境,不然上面的努力就功亏一篑了!
选好执行环境后,再根据IDE的提示在选择的虚拟环境下pip install 好所有的依赖包,知道自己的项目能够在虚拟环境中完美执行为止,说明所有依赖包已经安装完善。
最后,将所有已经安装好依赖包导出到txt文件,以便部署时使用,使用一下命令一键导出到项目的目录中(例如我的项目在D:\Python\project\team_plus):(venv) $ pip freeze > D:\Python\project\my_flask\requirements.txt
完成了上面,恭喜你又GET了很实用的新技能了!!!
写好项目的脚本启动文件
我们的项目是要在Linux系统的运行的,可不能像在IDE中那样点击运行,所以我们必须要用脚本去启动执行,虽然如此我们也不必担心太多,这一点flask_script包已经替我们思考到了,下载flask_script后,我们只需写一个manage.py模块从flask_script包中引入Manager模块,再传入app对象去实例化一个manage就搞定了,这样我们就自带了运行脚本runserver了,当然我们还可以定义更多的脚本命令,关于flask_script的更多可访问【http://flask-script.readthedocs.io/en/latest/】
为了实现这个功能,我们可以简单的这样定义,我们manage.py文件如下:from flask_script import Manager from app import app manager = Manager(app) # 注册一个manager实例,自带了runserver命令 @manager.command def hello(): """这只是一个测试命令""" print("OK") return "Hello World!" # 下面是IDE上运行入口,可不管 if __name__ == '__main__': app.run(host='0.0.0.0', port=8001, threaded=True)
调整项目中的绝对地址为相对地址
如果你的开发中有用到了绝对地址,请改用相对地址,云主机中的文件目录结构可不是与你的本地一样,不该后果有多严重不能用我多说吧,这里分享一个使用os模块的技巧:
在config.py文件中添加全局变量BASEPATHimport os BASEPATH = os.getcwd().replace('\\', r'\\') # 获取config.py所在目录的路径
其它相应的用BASEPATH替换掉,我想你应该懂我的意思的。
如果项目中已包含静态文件如:JS(请求接口的Ajax),记得替换掉接口
把接口地址改为如下格式:- 域名+接口 (如:http://mp.csdn.net/mdeditor)
- 云主机公网IP地址+端口号(如果不是默认的80端口就要加)
如:http://172.168.1.1:8001/mdeditor
如果需要数据库移植的可参考
我用的是MySQL数据库,下面的MySQL数据的数据库导出方法:
注意:如果数据库中有存了绝对路径的请改为想对路径的格式!# 导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 项目路径/导出的文件名 mysqldump -u dbuser -p dbname > 项目路径/dbname.sql
- 调整项目目录结构
可见,一个在本地的项目的标准的目录结构应该如下所示:
└── my_flask
│ ├── logs
│ └── app //Flask 程序目录
│ │ └── __init__.py //这是程序包文件。这个目录下还有其它的文件此处略过
│ ├── manage.py
│ ├── requirements.txt
│ ├── dbname.sql
项目打包为Linux常用的压缩包格式(.tar.bz2)文件
tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR、WinZip等主流压缩工具可以释放解开,却不能打包生成。但是tar.gz在服务器端却很常用,因为服务器系统linux占了相当的一部分。于是许多习惯用Windows的Web开发人员,在上传网站到空间时可能会遇到这个压缩格式的麻烦。如何生成得到tar.gz压缩包,“7-ZIP”这个软件可以很方便地解决这个问题。- 下载安装“7-ZIP”
【https://www.7-zip.org/】
- 具体使用步骤如下:
一、安装7-ZIP以后,直接在你想要打包的文件上点右键菜单,会有一个7-ZIP的子菜单栏,类似WinRAR和WinZIP的那种右键菜单。然后选“7-ZIP”->“添加到压缩档案”,在弹出来的窗口里有个“压缩格式”的选项,里面并没有tar.gz格式,没关系,里面有一个Tar格式,第一步就是要先压成tar格式。
二、成功打包为Tar文件后,可能会发现这个tar文件包和原来的文件大小一样,也就是说tar本身并没有压缩,而是仅仅把它们打包成一个单独的Tar文件。所以需要做第二步,再在这个tar文件上面点右键,选“7-ZIP”->“添加到压缩档案”,这时候弹出的窗口里再看“压缩格式选项”,发现多了两个刚才没有的,其中就包括“GZip”,是的,这一步就是把tar文件继续压缩成GZip。选择“GZip”格式后确定,最后结果就是一个新的tar.gz格式的文件。
- 下载安装“7-ZIP”
压缩包的上传
到了这里,我们的问题是如何将压缩包上传到云主机呢?如果不喜欢复杂的命令,那么一款好用的文件传输软件将是我们的不二选择——WinSCP。
简单介绍下此软件:
WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件,.winscp也可以链接其他系统,比如linux系统
下载地址【https://winscp.net/eng/download.php】
一路默认安装即可,安装完毕后如下界面:
如图输入相应内容即可登录连接,登录彻成功后,左边是本地主机,右边是云主机,选择刚刚的压缩包右击选择“传输”,再选择传到主机root下即可
至此,我们的flask项目的上传准备就全部搞定了,前期准备是相当重要的,如果前期都没做好,还谈何部署的问题呢!在下一篇文章我们的重心将会移到云主机上,我们主要进行云主机中虚拟环境的搭建、uwsgi的下载与配置、Nginx的下载与配置,一步一步让我们的flask项目在服务器上跑起来!
下一篇文章地址【https://blog.csdn.net/weixin_39212776/article/details/81321055】欢迎来读