heroku 部署flask应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_bigqiang/article/details/51180049

运行环境:ubuntu 14.04 ; python 2.7.6; git 2.7;

遇到bug :

  • 1 ,heroku login 无法登陆
  • 2,本地模拟heroku 测试软件foreman无法安装使用: 未解决
  • 3,数据库updagrate 报错

————————-越来越帅的分割线——————————————-

1 ,建立自己的本地git仓库,因为heroku是利用git将在你计算机的本地app程序推送到heroku上的云服务器的,所以这一步必须做。

  • 1.1 建立一个新文件夹 ,博主这里取名heroku2:
$ mkdir heroku2
  • 1.2 将这个文件夹初始化为git 仓库:
$ cd heroku2
$ git init

2 ,将你的所用程序复制到这个文件夹下,这里博主用的是flask web开发里的程序,克隆并切换作者提供的源码git checkout 17c (17c版本已经添加了所有程序运行需要的程序,所以比较方便),将程序复制黏贴到heroku2文件夹之后;
3,在heroku2/目录下新建requirements.txt,写入所有你需要的依赖包,因为heroku云端会自动安装顶级目录下的requirements.txt文件内的依赖,以下是部分内容,特别注意一定要写入26,27行的gunicorn(生产服务器),psycopg2(heroku云端支持的数据库所需要的包):
这里写图片描述
4, 修改17c中的config配置文件:
MAIL_SERVER = ‘smtp.qq.com’
MAIL_PORT = 587
FLASKY_MAIL_SUBJECT_PREFIX = ‘[Flasky]’ # 邮件抬头,改成你需要的
FLASKY_MAIL_SENDER = os.getenv(‘FLASKY_MAIL_SENDER’)# 管理员邮箱
5,将17c中的所有与数据库相关的提交都加上:

db.session.commit()

6,接下来因为要在本地计算机测试程序,所以要建立虚拟环境:

$ virtualenv venv

7,进入虚拟环境:
这里写图片描述

8 ,安装所有依赖:

$ pip install -r requirements.txt

9,再次修改config配置文件中的开发环境配置,这步的原因是因为博主之前是在MySQL数据库下开发,现在想换成作者的sqlite数据库,所以得改(如果看官不想换数据库可不改):
这里写图片描述
10,之后是本地数据库的事,把migrations文件夹下的versions里面的迁移文件全部删掉,(里面有10个.py文件,是数据库迁移文件)
11,由于博主按照书上的操作数据库迁移一直报错,博主使用自己新建数据库的方法代替迁移操作,在heroku2/manage.py中添加代码,为了方便自己建立和删除数据库:(注意下面的email和password要改成自己需要的账号和密码,方便测试登陆)

@manager.command    
def initdata():
    """ cretat a new data"""
    db.create_all()
    admin_role =Role(name = 'Administrator')
    mod_role = Role(name = 'Moderator')
    user_role =Role(name = 'User')
    user_john=User(username='john',role=admin_role,confirmed=True,email='xxxxxx@qq.com',
                        password='xxxxxx')
    user_susan=User(username='susan',role=user_role,confirmed=True,email='xxxxx@qq.com',
                        password='xxxxxxx')
    user_david=User(username='david',role=user_role,confirmed=True,email='xxxxxx@qq.com',
    password='xxxxxxxx')
    db.session.add_all([admin_role,mod_role,user_role,user_john,user_susan,user_david])
    db.session.commit()
    Role.insert_roles()
    User.generate_fake(100)
    Post.generate_fake(100)

@manager.command
def drop():
    """
    drop the database
    """
    db.drop_all()

12,新建 .gitignore 文件,写入要忽略版本控制的文件表达式:

venv
.env
*.pyc
*.sqlite

13,如果你之前有在自己的计算机上亲自开发过这个程序,那么相应环境变量肯定设置好了,如果你只是拷贝作者的代码想先试试部署程序,那你要先设置好本地的环境变量,好了,基本准备结束,准备测试程序在本地的环境运行情况,创建数据库,命令行输入以下命令之后会在heroku2/下看到data-dev.sqlite数据库文件:

$ python manage.py initdata

14,创建迁移仓库:

$ python manage.py db init

15,创建迁移脚本:

$ python manage.py db migrate -m 'v1.0'

16,更新数据库:

$ python manage.py db upgrade

17,在本地运行一下程序,应该没有问题

$ python manage.py runserver

打开网站测试一下http://127.0.0.1:5000/

18,commit本地仓库的所有代码,准备开始heroku:

$ git add *
$ git commit -m 'v1.0'

——————–一切准备妥当,开始heroku云端的部署——————–

19 ,注册heroku账户,并安装heroku toolbelt。在heroku官网上有说明。
20,登陆heroku 账户,
$ heroku login
这里博主遇 到两个bug,第一,一直登不上,显示无法connection,这时候最好准备梯子(能上google 的那种),你应该知道怎么做;第二个bug,输入密码之后一直显示post ….timeout字样
这里写图片描述
原因是博主之前已经登陆,所以可以不用理会,能进行heroku操作就证明你已经登陆了.

21,创建程序:

$ heroku  create  hlin2059

22 ,配置数据库:

$ heroku addons:create heroku-postgresql:hobby-dev
Creating postgresql-rectangular-17531... done, (free)
Adding postgresql-rectangular-17531 to hlin2059... done
Setting DATABASE_URL and restarting hlin2059... 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.

注意这里是2016.4.17的配置数据库提示,早前的配置与此不同,博主猜测是heroku本身进行了升级吧。此外也不需按照以往版本进行提升主数据库的操作。
这里我们需要注意一句话:Setting DATABASE_URL and restarting hlin2059… done, v3.也就是说,Heroku自动为我们刚刚创建的ulin2059程序创建了一个名为DATABASE_URL的环境变量,变量的值就是在Heroku平台中该数据库的路径地址,这也意味着,如果你想让你的Web应用部署成功后可以正常连接上该数据库,就必须在你的源代码中设置数据库的地址为:DATABASE_URL
23 ,根据你的程序设计配置环境变量:

$ heroku config:set FLASK_CONFIG=heroku
$ heroku config:set MAIL_USERNAME=<your-gmail-username>
$ heroku config:set MAIL_PASSWORD=<your-gamil-password>

可能你要配置的环境变量不止这些,博主的若干有关数据库的环境变量设置就不贴上来了,道理都一个样,你可以用以下命令查看你配置的环境变量:

$ heroku config

24 , 运行生产Web服务器,在本地测试一下生产服务器是否可用,登陆提示地址,注意gunicor默认端口是8000:

$ gunicorn manage:app

25,添加依赖需求文件requirements.txt 与Procfile文件,这其实在最开始已经添加,此处略过。
26,使用foreman进行测试,这一步博主一直没安装成功foreman,折腾了太久,foreman是可以在你本地创建heroku云端环境,其实如果以上步骤都没什么问题,对自己的程序有信心的话,这步可以跳过。
27,最后的最后,要推送自己的程序到heroku云端上,用到git命令:

$ 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://hlin2059.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
To https://git.heroku.com/hlin2059.git
 * [new branch]      master -> master

会有类似以上信息。
28,现在的操作都在heroku云端了,建立数据库:

$ heroku run python manage.py initdata

29,重启程序:

$ heroku restart

访问你的网站:https://hlin2059.herokuapp.com

bingo!!!!!

写在最后:
heroku上的数据库postgres,而博主之前的程序设计都是在MySQL上的运行,当然也在本地测试了sqlite数据库,而程序在这三者之中通用,究其原因是SQLAlchemy框架的功劳,封装了三种不同类型的数据。

参考链接:

  1. 《Flask Web Development: Developing Web Applications with Python》
  2. http://cocode.cc/t/first-update-heroku/3711
  3. http://cocode.cc/t/flask-heroku/4253
  4. http://xpleaf.blog.51cto.com/9315560/1739940
  5. http://cocode.cc/t/heroku-flask-web-application/3516
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页