开发一个小应用放在互联网上给大家使用是一件成就感很高的事情,不过支持Python的免费空间不是很多,虽然GAE支持Python,不过由于众所周知的原因,在国内是很难打开GAE,这篇文章为大家介绍一下Heroku,heroku支持Python,并且在数据量不大的情况下是免费。
Virtualenv,Python的虚拟环境模块
Virtualenvwrapper,在Virtualenv之上封装了一些更简便的方法
Flask,Python的web框架
Heroku Toolbelt,Heroku提供的命令行工具
sudo pip install Virtualenv
sudo pip install Virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.sh
这里source的路径可以通过:which virtualenvwrapper.sh
来确定
创建一个叫做toyapp的文件夹,用于存放这个项目相关的文件
进入toyapp,初始化一个git仓库
cd toyapp
git init
mkvirtualenv toyapp
创建一个虚拟环境好处在于:每个App都有其依赖的特定版本Python模块,不同版本的模块可能导致App无法运行,而在本地的Python主环境中只能安装一个版本的模块,并且不同的App也并不会需要安装主环境中的所有模块。
通过虚拟环境,我们可以为不同的环境安装不同版本的模块,同时也可以为App只安装需要必须模块的纯净环境。
通过mkvirtualenv命令创建虚拟环境后会默认进行这个虚拟环境
postactivate中的变量可以在运行workon(virtualenvwrapper提供的切换虚拟环境命令)后运行,比如,对于我们的项目,我们可以在postactivate添加cd命令,这样当我们切换到虚拟就可以进入到项目的目录中
vi $VIRTUAL_ENV/bin/postactivate
在虚拟环境中运行上面的命令,就可以编辑postactivate文件,在vim编辑器中,英文模式下输入i进入插入模式,添加cd 项目的路径,比如cd /Users/cloga/Documents/clogatoyapp,添加完毕后,按ESC键退出插入模式,英文模式下输入:wq保存修改并退出vim
用deactivate命令退出虚拟环境,再用workon toyapp命令进入虚拟环境,这时你会发现目录也会自动进入到项目的路径
deactivate
rmvirtualenv 虚拟环境
但是这个命令不会删除安装的模块,如果要删除所有按照的模块需要使用
rm -r 虚拟环境的文件夹
比如对于我的情况,需要使用
rm -r /Users/cloga/.virtualenvs/toyapp/
pip install flask
pip freeze > requirements.txt
requirements.txt里面记录了当前环境中安装的各种模块及其对应版本,当上传到Heroku时,Heroku会按照这个文件安装对应的模块,如果以后有新增的模块,也需要及时通过pip freeze命令将模块版本信息添加到这个文件中
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run()
在terminal中运行 python app.py,这样一个最简单的Flask web app就开始运行了,访问http://localhost:5000/试一下吧
如果要关闭服务器,按CTRL+C
所以简单来说,app.py的作用就是当有人访问/页面时返回‘Hello World!’字符串
免费的Heroku支持一个Dynos和10K以下记录的PgSQL
Toolbelt提供了Heroku的命令行工具
touch Procfile
在其中输入以下语句
web: gunicorn app: app
Profile是一个在应用根目录的文本文件,用于声明用于启动应用的语句
上面的一行语句声明了一个单一的进程类型:web以及运行它需要的语句。Web在这里很重要,它表明这个进程类型将隶属于Heroku的HTTP路由栈,并且在部署时接受web流量
pip install gunicorn
pip freeze > requirements.txt
heroku login
输入用户名和密码
heroku create toyapp
git add -A
git commit -m 'init'
git push heroku master
假设你创建了一个名字为test的github仓库,那么你可以通过下面的代码将本地的代码库与远程的Github库关联
git remote add origin https://github.com/cloga/test.git
通过git push orgin master
,就可以将本地的代码库推送到github。
heroku open
PS:我在Heroku上放了两个小项目: