最近尝试了下将自己的django项目部署到Heroku上。虽然大家都说Heroku是为Ruby on Rails准备的, 但它也支持python和django,在网站运行初期使用它还是比较方便的。

官方文档中对于部署django的方法有详细说明,这里就不再罗嗦了,只给出几个重点。

如何部署代码?

首先要安装Heroku工具链

如果我已用GitHub管理代码,怎样将代码部署到Heroku上?Heroku使用git实现部署,部署就像推送代码一样简单。 首先要登录Heroku建立你的App,然后在App的Settings里可以看到Git URL,例如:

git@heroku.com:yourapp.git

然后到你自己的代码库中,把这个代码库添加为remote

$ git remote add heroku git@heroku.com:yourapp.git

部署时只需执行

$ git push heroku master

就可以了。

如何安装依赖包?

在你自己的开发环境中执行:

$ pip freeze > requirements.txt

这个命令会把环境中安装的所有包输出到requirements.txt中。将这个文件放到代码库根目录下,部署后就可以自动安装依赖包了。 你也可以编辑下requirements.txt去掉不必要的包。

如何运行代码?

Heroku要求你自己指定运行服务的命令。一般使用gunicorn来运行django代码,所以要在代码仓库的根下建立一个Procfile文件, 以指定运行代码的命令:

$ cat Procfile
web: gunicorn -b 0.0.0.0:$PORT yourapp.wsgi

注意这里的-b参数(绑定地址)。每次Heroku运行代码时,会随机分配一个端口号,保存在环境变量$PORT里, 代理服务器会用这个端口号来访问你的应用。所以服务要绑定到0.0.0.0:$PORT上,否则Heroku的代理就找不到了。 yourapp.wsgi指的是django项目中的yourapp/wsgi.py

还有一点要注意的是,Heroku提供的运行环境中并不包括gunicorn,所以要把gunicorn也加到requirements.txt中。

如何判断Heroku环境/如何配置数据库

我们的代码需要判断当前环境是开发环境还是Heroku环境,以执行不同的操作(比如判断是否打开调试模式等)。 可以采用如下方法。

首先,在Heroku环境中建立环境变量:

$ heroku config:set HEROKU_ENV=TRUE

然后在代码里(一般在settings.py)这样写:

if 'HEROKU_ENV' in os.environ:
    # it is in heroku env
else:
    # it is in dev env

那么如何设置数据库呢?Heroku提供的数据库是PostgreSQL,连接字符串保存在$DATABASE_URL中。 可以使用dj_database_url包导入数据库配置。在settings.py中这样写:

# parse the database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] = dj_database_url.config()

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

当然,不要忘了把dj_database_url放到requirements.txt里。