flask程序部署到heroku平台的过程

一.准备app及开发环境

(若已经准备好可以跳过直接到后面的部署,下面我以原书作者源代码为示例)
1.在github上新建一个仓库(假设为myapp),然后克隆到本地(不要照抄下面的代码,只是个实例,根据自己情况更改)
$ git clone https://github.com/user/myapp.git
2.把作者的源码克隆到本地
$ git clone https://github.com/miguelgrinberg/flasky
执行git checkout,切换到最新的代码
3.$ git checkout 17d
然后全部copy到你的app目录下(但是不要复制替换自己独有的.git文件夹,README.md文件无所谓。.git文件夹是当前项目的版本库,每次commit的时候都会往版本库的当前分支提交更改,通常都是隐藏的,显示隐藏方法是打开文档,按F10显示工具栏,【工具】【文件夹选项】【查看】【隐藏文件和文件夹】【不显示隐藏文件、文件夹或驱动器】,确定
这时你发现目录下只有requirements文件夹,需求文件都在文件夹里,在本地执行pip install时没有任何问题,但是在部署的时候heroku不认识,它无法识别你的app运行环境,会拒绝你的push请求,因此要在app顶级文件夹根目录下新建requirements.txt,把生产环境需要的依赖包名字复制到文本中,如下面所示
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-HTTPAuth==2.7.0
Flask-Login==0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.1
Flask-PageDown==0.1.4
Flask-SQLAlchemy==1.0
Flask-SSLify==0.1.4
Flask-Script==0.6.6
Flask-WTF==0.9.4
Jinja2==2.7.1
Mako==0.9.1
Markdown==2.3.1
MarkupSafe==0.18
SQLAlchemy==0.9.9
WTForms==1.0.5
Werkzeug==0.10.4
alembic==0.6.2
bleach==1.4.0
blinker==1.3
html5lib==1.0b3
itsdangerous==0.23
six==1.4.1
gunicorn==18.0
psycopg2==2.5.1
4.修改config.py文件,主要是配置电子邮件以及管理员邮箱
MAIL_SERVER = ‘smtp.qq.com’
MAIL_PORT = 25
FLASKY_MAIL_SUBJECT_PREFIX = ‘[Flasky]’ # 邮件抬头,改成你需要的
FLASKY_MAIL_SENDER = ‘Flasky example@gmail.com’# 管理员邮箱,改成你的

二.创建虚拟环境,然后安装依赖包、创建并迁移数据库

1.cd 到myapp的目录
2.创建虚拟环境,virtunalenv venv
3.激活虚拟环境,venv/Scripts/activate
4. 安装依赖包,pip install -r requirements.txt
或许你安装模块的时候,psycopg2 这个会最后会安装失败,这个时候,你把requirements.txt 文件里的psycopg2 先删掉,然后pip install -r requiremens.txt 然后,单独安装psycopy2 :pip install psycopg2。最后再把psycopg2 加到requirements.txt文件里。
然后你可以在本地运行一下,应该没有问题
$ python manage.py runserver
打开网站测试一下http://127.0.0.1:5000/
此处并没有结束,因为你发现没有数据库
把migrations文件夹下的versions里面的迁移文件全部删掉,自己重新创建(里面有10个.py文件,是数据库迁移文件,我在往heroku迁移中失败了无数次。重建一次性迁移的好处是部署简单,坏处是在测试单项功能时没法回滚,以后在开发自己的app时增加一个功能迁移一次,有利于回滚到上一次)ps:我并没有删掉
5.输入python manage.py db migrate -m “init migrations”
这时你可以看到前面的versions文件夹中出现一个文件就对了
6.然后更新数据库,输入python manage.py db upgrade
根目录下出现一个data-dev.sqlite文件就ok了,再在本地运行时全部功能就没问题了
【 再做一个铺垫工作
在文件夹中新建一个.gitignore文件,输入gedit .gitignore或者gvim .gitignore
内容如下(这是忽略文件,防止把不用的或者重要的文件上传到git,因此你可以根据自己的情况填写,你也可以把作者的复制过去, lsa less .gitignore查看此文件):venv,.pyche,.sqlite】我并没有做,但是我发现在git bash可以操作,而且我把改动提交到Git仓库中,这些文件都不能提交,说明作者已经弄好。

三.heroku方面的准备

1.注册Heroku账户
说明:heroku 免费账户,最多只能存在5个app,想删除的话:
heroku apps
heroku apps:destroy your_app_name
这几个命令是通过 heroku apps –h (或者heroku –h)学会的。
2.安装Heroku Toolbel
先下载安装Heroku Toolbelt, 然后在命令行中输入

heroku login

结果:

C:\Users\Geek Lee>heroku login
heroku-cli: Installing CLI... 18.54MB/18.54MB
再次输入
(venv) C:\Users\Geek Lee\webapp>heroku login
Enter your Heroku credentials.
Email: 123456789@qq.com
Password (typing will be hidden):
Logged in as 1234567789@qq.com

保证网络良好(fanqiang)
3.创建程序:

(venv) C:\Users\Geek Lee\webapp>heroku create geekleee
Creating geekleee... !
 !    Name is already taken

venv) C:\Users\Geek Lee\webapp>heroku create geekleeee
Creating geekleeee... done
https://geekleeee.herokuapp.com/ | https://git.heroku.com/geekleeee.git

4.配置数据库

(venv) C:\Users\Geek Lee\webapp>heroku addons:create heroku-postgresql:hobby-dev

Creating heroku-postgresql:hobby-dev on geekleeee... free
Created postgresql-deep-71061 as DATABASE_URL
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

提升为主数据库

(venv) C:\Users\Geek Lee\webapp>heroku pg:promote postgresql-deep-71061
Ensuring an alternate alias for existing DATABASE... done, HEROKU_POSTGRESQL_NAV
Y
Promoting postgresql-deep-71061 to DATABASE_URL on geekleeee... done

同样后面这个 HEROKU_POSTGRESQL_MAUVE要跟你创建的数据库一致。
然后可以输入

(venv) C:\Users\Geek Lee\webapp>heroku config
=== geekleeee Config Vars
DATABASE_URL:               postgres://qwgbictjijwjom:XHwz6uH-zBbuoDrdINeVl-HwmV
@ec2-174-129-223-35.compute-1.amazonaws.com:5432/dcriterq8qjb66
HEROKU_POSTGRESQL_NAVY_URL: postgres://qwgbictjijwjom:XHwz6uH-zBbuoDrdINeVl-HwmV
@ec2-174-129-223-35.compute-1.amazonaws.com:5432/dcriterq8qjb66

看一下是否有DATABASE_URL

5.配置日志和电子邮件地址
书上代码
以及如下
要查看日志可以在Heroku客户端(就是登录Heroku后的命令行界面)中输入

heroku logs

或者

heroku logs --tail

接下来是配置日志和电子邮件,如果之前是17c版本可以直接看书上的内容,17b的话就要加上书上的代码
然后是设置环境变量

heroku config:set MAIL_USERNAME=<your-gmail-username> #电子邮件地址
heroku config:set MAIL_PASSWORD=<your-gamil-password> #stmp密码

6.运行生产Web服务器:
我的操作系统是Win10,这一步没办法运行,Unix系统应该可以。所以我这一步是直接略过的。接下来的添加依赖需求文件与Procfile文件直接安装书上来就可以了
7.使用Foreman进行测试:
这一步我的系统也是不行。但是可以用run-the-app-locally17代替,具体的看网页的内容吧。
补充一下:如果你可以用Foreman,应该要加入.env,那要记得在..gitignore加入.env,以防被添加到Git仓库中
8.添加依赖需求文件
9.添加Profile文件
10.使用Flask-SSLify启用安全HTTP:这个按照书上来就可以了
省略的都是代码,我的代码是git checkout 17c,所以不用写了,git checkout 17b需要不上代码!

四.执行git push命令部署和部署一次升级

1.将程序上传到Heroku服务器:在此之前,你要确保所有的改动都都提交到本地Git仓库,执行的操作如下:

(venv) C:\Users\Geek Lee\webapp>git add .idea

(venv) C:\Users\Geek Lee\webapp>git add app

(venv) C:\Users\Geek Lee\webapp>git add migrations

(venv) C:\Users\Geek Lee\webapp>git add requirements

(venv) C:\Users\Geek Lee\webapp>git add tests

(venv) C:\Users\Geek Lee\webapp>git add tmp

(venv) C:\Users\Geek Lee\webapp>git add venv
The following paths are ignored by one of your .gitignore files:
venv
Use -f if you really want to add them.

(venv) C:\Users\Geek Lee\webapp>git add config.py

(venv) C:\Users\Geek Lee\webapp>git add LICENSE

(venv) C:\Users\Geek Lee\webapp>git add manage.py

(venv) C:\Users\Geek Lee\webapp>git add Procfile

(venv) C:\Users\Geek Lee\webapp>git add README.md

(venv) C:\Users\Geek Lee\webapp>git add requirements.txt

(venv) C:\Users\Geek Lee\webapp>git commit -m "last change"
[master d752bd7] last change
 1 file changed, 26 insertions(+)
 create mode 100644 migrations/versions/2133e3b2356_init_migrations.py

(venv) C:\Users\Geek Lee\webapp>git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 671 bytes | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To git@github.com:Geek-Lee/webapp.git
   f8550d5..d752bd7  master -> master

说明:
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
到这一步,首先git status .检查一下,是不是所有改动都已提交到你的本地git 仓库。

PS:我说几个git 命令,你看你了解了吗。
git remote -v
git branch -v 
git log --oneline --decorate 
git add .
git commit -m "msg"
git log --pretty=format:"%h %s" --graph
git merge branch_name

2.然后就可以执行:

(venv) C:\Users\Geek Lee\webapp>git push heroku master
Counting objects: 143, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (133/133), done.
Writing objects: 100% (143/143), 120.12 KiB | 0 bytes/s, done.
Total 143 (delta 39), reused 3 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: -----> Python app detected
remote: -----> Installing python-2.7.12
remote:      $ pip install -r requirements.txt
remote:      Collecting Flask==0.10.1 (from -r requirements.txt (line 1))
·······
remote:        https://geekleeee.herokuapp.com/ deployed to Heroku
remote: Verifying deploy... done.
To https://git.heroku.com/geekleeee.git
 * [new branch]      master -> master

3.然后就可以执行这个命令了:

heroku run python manage.py deploy

正常的话应该应该会跟书上的示例一样。我这里出现了问题,只要是heroku run相关都会卡住不动,类似于下面这样,只能终止操作
我这里用以下这个命令代替

heroku run:detached python manage.py deploy

4.接着就是

heroku restart

至此程序就部署好了,可以通过
https://.heroku-kuapp.com访问
5.部署升级:

git add README.md        #把改动添加git上
git commit -m "注释"     #通过git推送到本地库,注明注释
git  push origin master  #把本地库推送到远程库master主分支

重点:!!!所有改动都提交到Git仓库后!!!(以上操作),执行以下命令:

heroku maintenance:on
git push heroku master
heroku run python manage.py deploy
heroku restart
heroku maintenance:off

参考文章:
【flasky/heroku/部署】(欢迎大家挑刺和补充)可能是目前为止最详细的了
(first update)终于成功部署在heroku上了,欢迎交流
分享一下flask程序部署到heroku平台的过程
说说自己用heroku部署flask web application遇到的几个坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值