如何部署Python Web应用:记录一次Heroku部署完整过程

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

0.选择Heroku云平台

    

    伴随着云计算的浪潮,国内的云服务可谓多种多样,价格虽然不高,但是真正能够提供永久免费使用的,哪怕有些限制也好,似乎也找不到。

    出于学习/研究/实验/测试或是真正应用等各种需求,这时我们不妨使用把应用部署到国外的Heroku云平台上,Heroku的免费版除了其提供的Postgres数据库有限制之外(小于1万条记录的小型数据库不用付费就可以添加到自己的Web应用上),其它都可以免费使用,这绝对是不二的选择。

    另外一点来说,Heroku对Python的支持非常良好,所以部署起来会轻松很多,这就省去了许多不必要的麻烦了。

    最近要把应用部署到Heroku上,这里把完整的部署过程分享给大家。




说明:我使用的操作系统是Ubuntu 15.10,部署的Python Web应用为基于Flask的应用,下面的部署过程都是在该操作环境下进行部署,建议大家也在Linux环境下进行部署,会方便很多。(当然你有Mac Book就更好了,只是博主没钱,用不起啦)


1.准备Git环境

   

     要想使用Heroku,你的Web应用必须要托管在Git仓库中,如果你之前一直是使用Git的方式来作开发的,那问题就很容易解决了,相信你很明白其中的道理。如果不是的话,请按照下面我的方法来生成一个Git仓库,非常简单。

    很多人觉得使用Git很麻烦,于是就放弃了Heroku平台的使用,这不能不说是一种极大的浪费:

1.首先浪费的是Heroku这么好的一个平台资源;

2.然后就是放弃了Git这么优秀的版本控制系统的使用

3.再者说就是放弃了Linux环境的使用。

    其实这些对于开发来说都是非常有帮助的!所以不要觉得麻烦,只要你以后不是完全做Windows平台的开发,这些你都应该要懂,只要慢慢习惯了,后面一切就都很自然了。


第一步:安装Git

    以Ubuntu为例,可以直接使用下面的命令安装:

1
sudo  apt-get  install  git

    当然如果你正在使用的是其它版本的Linux发行版本,相信安装方法也不难。


第二步:把你的完整Web应用放到一个新的目录中

    比如这里我已经有一个开发完整的Web应用,它主要有下面的这些文件和应用:

1
2
3
4
5
6
7
8
9
10
11
drwxrwxr-x  6 xpleaf xpleaf 4096  1月 29 16:04 .
drwxr-xr-x 38 xpleaf xpleaf 4096  1月 29 16:01 ..
drwxrwxr-x  7 xpleaf xpleaf 4096  1月 29 03:31 app
-rw-rw-r--  1 xpleaf xpleaf 3295  1月 29 03:31 config.py
-rw-rw-r--  1 xpleaf xpleaf 1083  1月 29 03:31 LICENSE
-rwxrwxr-x  1 xpleaf xpleaf 2391  1月 29 03:31 manage.py
drwxrwxr-x  3 xpleaf xpleaf 4096  1月 29 03:31 migrations
-rw-rw-r--  1 xpleaf xpleaf   25  1月 29 03:13 Procfile
-rw-rw-r--  1 xpleaf xpleaf  376  1月 29 03:31 README.md
-rw-rw-r--  1 xpleaf xpleaf   76  1月 29 03:13 requirements.txt
drwxrwxr-x  2 xpleaf xpleaf 4096  1月 29 03:31 tests

    然后创建一个名为Heroku_pro的文件夹,并把上面完整的Web应用程序放进去,如下:

1
2
3
4
xpleaf@leaf:~ /Heroku_pro pwd
/home/xpleaf/Heroku_pro
xpleaf@leaf:~ /Heroku_pro ls
app  config.py  LICENSE  manage.py  migrations  README.md  requirements.txt  tests Procfile

    这一步完成!


第三步:在Heroku_pro目录下生成一个Git仓库

1
2
xpleaf@leaf:~ /Heroku_pro $ git init
初始化空的 Git 版本库于  /home/xpleaf/Heroku_pro/ .git/

    这时你会发现在当前目录下多了一个.git的目录:

1
2
3
xpleaf@leaf:~ /Heroku_pro ls  -a
.   app        .git     manage.py   README.md     tests
..  config.py  LICENSE  migrations  requirements

    这一步完成。


第四步:把当前目录下的所有文件都托管到本地Git仓库

1
2
3
4
5
6
7
8
9
10
xpleaf@leaf:~/Heroku_pro$ git add .
xpleaf@leaf:~/Heroku_pro$ git commit -m  "ver1.0"
[master (根提交) a7cea3f] ver1. 0
  78  files changed,  3350  insertions(+)
  create mode  100644  LICENSE
  create mode  100644  README.md
  create mode  100644  app/__init__.py
  create mode  100644  app/api_1_0/__init__.py
  create mode  100644  app/api_1_0/authentication.py
  ......

    Ok,这一步完成。


    关于Git的使用显然不是这里要讨论的重点,这里只是为没有用过Git的朋友提供一种临时的解决方案。




2.注册Heroku账户

    

    跟目前国内的大多数云平台一样,首先你也需要注册一个账号,可以在下面的链接进行注册:

    https://www.heroku.com/

    wKiom1arIdeCH2S0AAAwrabARcc665.png




3.安装Heroku Toolbelt客户端

    

    Toolbelt是Heroku的命令行工具,使用该客户端的好处是,我们完全可以在本地通过命令行操作的方式来管理我们托管在Heroku上的Web应用。

    以Ubuntu为例,参考官方的安装文档:

wKioL1arJNPyFfuxAAFTt-ic4Oo654.png    我们使用下面的命令来进行安装就可以了:

1
wget -O- https: //toolbelt .heroku.com /install-ubuntu .sh | sh

    可以参考这里的官方文档:https://toolbelt.heroku.com/




4.登陆Heroku

    在刚刚的Heroku_pro目录下执行下面的命令,登陆到Heroku上:

1
2
3
4
5
6
xpleaf@leaf:~ /Heroku_pro $ heroku login
Enter your Heroku credentials.
Email: flasky_mini@sina.com
Password (typing will be hidden): 
Logged  in  as flasky_mini@sina.com
xpleaf@leaf:~ /Heroku_pro $

    注意登陆成功后的提示:Logged in as flasky_mini@sina.com

    需要注意的是,login命令默认会自动为你当前的主机创建SSH公钥并上传,SSH公钥非常重要,在你后面执行git push命令的时候是必须要用到的,不过不用担心,heroku的客户端会自动帮我们处理好。当然你也可以手动上传,只需要执行命令:heroku keys:add。




5.使用Heroku客户端创建app程序


    所谓的app程序其实就是herokuapp.com的一个子域名,当你在Heroku创建了一个名为my-heroku-app-cn的app程序之后,如果你部署成功,你就可以直接通过地址https://my-heroku-app-cn.herokuapp.com来访问你的Web应用,因此名字要注意,不能使用别人已经使用过的。我们下面就来创建一个。

1
2
3
xpleaf@leaf:~ /Heroku_pro $ heroku create my-heroku-app-cn
Creating my-heroku-app-cn...  done , stack is cedar-14
https: //my-heroku-app-cn .herokuapp.com/ | https: //git .heroku.com /my-heroku-app-cn .git

    出现上面的提示,就说明程序创建成功了!Heroku还分配了一个Git服务器给我们,地址为

    当然,其实app程序的名字也是可以改的,你只要登陆官居网,在你的个人信息页里就可以修改。




6.配置数据库


    Heroku以扩展的方式支持Postgres数据库,只是有些限制而已,正如前面所说。这里我们就使用Postgres数据库,这也意味着,你需要在你的Web应用源代码中添加相应的数据库路径,这个我们待会再说。

    使用下面的命令配置数据库:

1
2
3
4
5
6
7
8
xpleaf@leaf:~ /Heroku_pro $ heroku addons:create heroku-postgresql:hobby-dev
Creating postgresql-rectangular-17531...  done , ( free )
Adding postgresql-rectangular-17531 to my-heroku-app-cn...  done
Setting DATABASE_URL and restarting my-heroku-app-cn...  done , v3
Database has been created and is available
  ! This database is empty. If upgrading, you can transfer
  ! data from another database with pg:copy
Use `heroku addons:docs heroku-postgresql` to view documentation.

    出现上面的提示也就说明数据库配置成功了,关于该数据库的详细信息,你也可以到官网的个人中心进行查看,里面有非常详细的说明,如下:

wKioL1arLkPh3tgwAAAyoMoXOPA985.png

wKiom1arLHWxUsiGAABaJNUtBsI656.png

wKioL1arLL7QrszqAAA4cAWiwdE778.png

    这里我们需要注意一句话:Setting DATABASE_URL and restarting my-heroku-app-cn... done, v3

    也就是说,Heroku自动为我们刚刚创建的my-heroku-app-cn程序创建了一个名为DATABASE_URL的环境变量,变量的值就是在Heroku平台中该数据库的路径地址,这也意味着,如果你想让你的Web应用部署成功后可以正常连接上该数据库,就必须在你的源代码中设置数据库的地址为:DATABASE_URL,仅此而已,其它的Heroku会为我们完成,不用担心。




7.配置必要的环境变量


    这不是必要的,这取决于你的Web应用的源代码中是否有获取系统环境变量的需要,如果有的话,你可以通过下面的方式进行环境变量的设置。

    比如我在我的源代码的配置文件中有下面的两行代码:

1
2
MAIL_USERNAME  =  os.environ.get( 'MAIL_USERNAME' )
MAIL_PASSWORD  =  os.environ.get( 'MAIL_PASSWORD' )

    显然电子邮件的用户名和密码这些敏感的信息不应该出现在源代码中,所以我是通过获取环境变量的值来知道用户名和密码的,因此我需要在Heroku上设置相对应的环境变量,命令如下:

1
2
3
4
5
6
xpleaf@leaf:~ /Heroku_pro $ heroku config: set  MAIL_USERNAME= "xpleaf"
Setting config vars and restarting my-heroku-app-cn...  done
MAIL_USERNAME: xpleaf
xpleaf@leaf:~ /Heroku_pro $ heroku config: set  MAIL_PASSWORD= "***"
Setting config vars and restarting my-heroku-app-cn...  done
MAIL_PASSWORD: ***

    当然如果你需要设置其它的环境变量,通过这个方式设置就可以了。




8.使用生产Web服务器


    我们知道,在使用DjangoFlask作开发的时候,它们都自带了开发Web服务器来连接我们的Web应用程序,这对于在开发的过程中来说是再适合不过的了。然而现在我们要做的是在生产环境中部署我们的Web应用程序,因此你不可能说还使用原来这些Web框架自带的开发服务器,因为性能实在是不可保证,因为它们都是为开发环境设计的Web服务器,而不是为生产环境设计的。所以,我们要使用生产环境的Web服务器。(PS:请注意Web应用程序Web服务器的区别)

    我要部署的Web应用程序是基于Flask的,所以当然要使用一个支持Flask的Web服务器软件,这里我使用的是Gunicorn。当然,这取决于你使用的是什么Web框架,关于这点,可自行去了解。

    选择了要使用Gunicorn来作为我的生产环境,我待会只需要把它添加到依赖需求文件中去就可以了。

    当然,你也完全可以把Gunicorn下载下来进行本地的测试,由于不是每个人都使用的Python Web框架都是Flask或者使用的生Web服务器软件是Gunicorn,所以这里就不提及。




9.添加依赖需求文件和Profile文件


    这是必需也是非常重要的一点,否则的话部署很难成功!

    Heroku要求在我们的Web程序(这里针对Python的Web应用程序)目录中必须要有下面的两个文件:

  

必需文件 说明
requirements.txt Web应用程序所依赖的各种第三方扩展包
Procfile 里面包含的是我的Web应用服务器启动时执行的命令

    正如刚刚在我的Heroku_pro目录下看到的:

1
2
3
xpleaf@leaf:~ /Heroku_pro ls  -l requirements.txt Procfile 
-rw-rw-r-- 1 xpleaf xpleaf 25  1月 29 03:13 Procfile
-rw-rw-r-- 1 xpleaf xpleaf 76  1月 29 03:13 requirements.txt

    注意这两个文件必须位于当前Heroku_pro目录下。

    requirements.txt的文件内容类似于这样:

1
2
3
4
5
6
7
8
9
10
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-HTTPAuth==2.7.0
Flask-Login==0.3.1
...
SQLAlchemy==0.9.9
WTForms==1.0.5
Werkzeug==0.10.4
alembic==0.6.2
bleach==1.4.0

    里面包含了支撑我的Web应用程序运行的各种扩展包。当然至于内容是什么,取决于你正在开发的Web项目。

    而Profile文件的内容则类似于这样:

1
web: gunicorn manage:app

    正如前面所说,里面放的是命令,比如这里的这个命令就是用来启动我前面所说的Gunicorn生产环境Web服务器的。

    再次说明,这两个文件非常重要,如果没有的话,待会部署就会失败的。




10.执行git push进行部署


    前面的确认无误之后,就可以部署了,当然,如果你临时修改了你当前Heroku_pro目录下的文件,请先使用下面的命令提交你的修改:

1
2
git add .
git commit -m  "ver1.0"

    Ok,下面就开始部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
xpleaf@leaf:~ /Heroku_pro $ git push heroku master
对象计数中: 97, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (90 /90 ), 完成.
写入对象中: 100% (97 /97 ), 35.04 KiB | 0 bytes /s , 完成.
Total 97 (delta 22), reused 0 (delta 0)
remote: Compressing  source  files...  done .
remote: Building  source :
remote: 
remote: -----> Python app detected
remote: -----> Installing runtime (python-2.7.11)
remote: -----> Installing dependencies with pip
remote:        Collecting Flask==0.10.1 (from -r requirements /common .txt (line 1))
..........
remote: -----> Preparing static assets
remote:        Collectstatic configuration error. To debug, run:
remote:        $ heroku run python manage.py collectstatic --noinput
remote: 
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 37.2M
remote: -----> Launching...
remote:        Released v6
remote:        https: //my-heroku-app-cn .herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy....  done .
To https: //git .heroku.com /my-heroku-app-cn .git
  * [new branch]      master -> master

    会看到中间有一大堆的输出信息,这是Heroku为我们的环境安装所需的软件包,而这些软件包即是前面我们在需求文件中指定的。当然这些操作都是在Heroku中执行的,我们本地只是看到它的一个操作过程而已。

    部署完成后,根据我的Flask应用所选择的Web服务器的启动方式,使用下面的命令来进行启动:

1
2
3
4
5
6
7
8
9
10
11
#启动Web服务器进行相关初始化配置
xpleaf@leaf:~ /Heroku_pro $ heroku run python manage.py deploy    
Running python manage.py deploy on my-heroku-app-cn... up, run.7690
INFO  [alembic.migration] Context impl SQLiteImpl.
......
INFO  [alembic.migration] Running upgrade 288cd3dc5a8 -> 2356a38169ea, followers
INFO  [alembic.migration] Running upgrade 2356a38169ea -> 51f5ccfba190, comments
 
#重新启动
xpleaf@leaf:~ /Heroku_pro $ heroku restart
Restarting dynos...  done


    上面的完成后,就可以访问我们创建的Web应用了:

     https://my-heroku-app-cn.herokuapp.com/

    当然,当你访问它的时候可能我已经把它关掉了,你可以访问另一个用同样方法部署的应用的地址:

     https://flasky-mini.herokuapp.com/




11.升级


    如果你需要对你的源代码修改以增加或删除某些功能,在Heroku_pro目录下修改了之后,请依次执行下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
#告诉Heroku,你要进行升级操作
heroku maintenance:on
 
#提交部署
git push heroku master
 
#重新运行服务器
heroku run python manage.py deploy
heroku restart
 
#告诉Heroku,升级完成
maintenance:off



    Ok,到这里的话,本文就结束了,其实关于部署应用到Heroku上,无论你的Web应用是基于Python开发的,或者是其它语言,都是类似的,只是这里侧重说的是Python的Web应用。

    当然在实际的部署过程当中可能会遇到各种各样的问题,这时就需要充分发挥你的随机应变能力了,当出现问题时,可以Google查找(百度找的资料很少,Google上不了就自己想办法吧),或者到Stack Overflow上面去查找或是提问,同时要根据提示的错误信息去阅读官方的文档来解决存在的问题。

    但不管怎么说,部署Python Web应用的主要流程是类似于上面所给出的操作,本文相信对初次在Heroku上部署Python Web应用的朋友会有所帮助,写此文,也确实是希望帮到更多的朋友,因为目前国内有关Python Web部署资源实在不多,更别说部署到国外的云平台上去了。

    好吧,希望帮到有需要的朋友,谢谢大家!


参考:

《Flask Web Development: Developing Web Applications with Python》

https://help.heroku.com/

https://devcenter.heroku.com/articles/getting-started-with-python#introduction


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
74 7
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
83 3
|
2月前
|
机器学习/深度学习 算法 数据挖掘
线性回归模型的原理、实现及应用,特别是在 Python 中的实践
本文深入探讨了线性回归模型的原理、实现及应用,特别是在 Python 中的实践。线性回归假设因变量与自变量间存在线性关系,通过建立线性方程预测未知数据。文章介绍了模型的基本原理、实现步骤、Python 常用库(如 Scikit-learn 和 Statsmodels)、参数解释、优缺点及扩展应用,强调了其在数据分析中的重要性和局限性。
78 3
|
13天前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
67 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
2月前
|
存储 前端开发 API
Python在移动应用开发中的应用日益广泛
Python在移动应用开发中的应用日益广泛
61 10
|
1月前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
43 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索未来编程:Python在人工智能领域的深度应用与前景###
本文将深入探讨Python语言在人工智能(AI)领域的广泛应用,从基础原理到前沿实践,揭示其如何成为推动AI技术创新的关键力量。通过分析Python的简洁性、灵活性以及丰富的库支持,展现其在机器学习、深度学习、自然语言处理等子领域的卓越贡献,并展望Python在未来AI发展中的核心地位与潜在变革。 ###
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
84 8
|
16天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
52 0