在Heroku上部署django项目
最近尝试了下将自己的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
里。