Deploy
目前为止,我们所有的工作都是在自己的电脑完成,你可以在自己的浏览器上看到成果。但是,如果我们想要让其他使用者使用这个网站,就必须将它部署(deploy)到稳定的伺服器上,才能随时浏览。
我们选择 Heroku 作为这次的范例,它的免费额度足够经营一个小型网站,并拥有完善的开发者教学资源。
本章根据 Heroku 的官方教学 “Getting Started with Django on Heroku” 稍作调整,教你如何准备部署,并在 Heroku 上发佈你的网站。
安装部署工具
首先利用 pip
安装一些部署时需要用到的套件:
(djangogirls_venv) ~/djangogirls$ pip install dj-database-url gunicorn dj-static
当终端机显示 Successfully installed... 时,表示必要的套件都已经安装好了。
部署准备
为了让 server 了解部署时所需要的安装环境,我们需要调整和准备一些设定档案。
requirements.txt
在 djangogirls
专案目录底下,利用以下的指令将此虚拟环境裡的 Python 套件全部条列出来,包括套件名称与版本资讯,并储存于 requirements.txt :
(djangogirls_venv) ~/djangogirls$ pip freeze > requirements.txt
由于 Heroku 使用 PostgreSQL 资料库,我们还需要手动在 requirements.txt
最后面加上 psycopg2==2.6.1
(Python 的 PostgreSQL 模组)。最终的档案内容范例如下,版本可能会稍有不同:
# djangogirls/requirements.txt
Django==1.8.6
appnope==0.1.0
decorator==4.0.4
dj-database-url==0.3.0
dj-static==0.0.6
gnureadline==6.3.3
gunicorn==19.3.0
ipython==4.0.0
ipython-genutils==0.1.0
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.5
ptyprocess==0.5
simplegeneric==0.8.1
static3==0.6.1
traitlets==4.0.0
psycopg2==2.6.1
Procfile
建立一个 Procfile 档案,告诉 Heroku 要如何启动我们的应用:
web: gunicorn --pythonpath mysite mysite.wsgi
这一行指令分成两个部分,其格式 <process_type>: <command>
表示:
- -- 启用
web
应用 -- Gunicorn 是一个用 Python 开发的 WSGI 工具,可以用来执行 Django 的网站。我们透过指令下列指令来启动网站: gunicorn --pythonpath <directory_path> <project_name>.wsgi
runtime.txt
为了让 Heroku 知道要用哪一个版本的 Python,新增 runtime.txt 输入:
python-3.4.3
production_settings.py
在前面的章节中,我们透过修改 settings.py
来调整 Django project 的设定,但是通常正式上线(production)的环境会和开发/本机(development/local)环境有所不同。所以我们在 mysite/mysite/
底下新建一个 production_settings.py
,专门放部署时所需要的设定:
# mysite/mysite/production_settings.py
# Import all default settings.
from .settings import *
import dj_database_url
DATABASES = {
'default': dj_database_url.config()
}
# Static asset configuration.
STATIC_ROOT = 'staticfiles'
# Honor the 'X-Forwarded-Proto' header for request.is_secure().
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Allow all host headers.
ALLOWED_HOSTS = ['*']
# Turn off DEBUG mode.
DEBUG = False
wsgi.py
WSGI - Web Server Gateway Interface 是 Python 定义网页程式和伺服器沟通的介面。为了让 Heroku 的服务能够透过这个介面与我们的网站沟通,修改 mysite/mysite/wsgi.py
如下:
# mysite/mysite/wsgi.py
import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = Cling(get_wsgi_application())
我们将 dj_static 引入,并在 application
上使用它,以协助帮我们部署 static 档案(例如图片、CSS、JavaScript 档案等等)。
.gitignore
我们不希望把有些开发时使用的档案,例如虚拟环境、本机资料库等等,都一股脑放到网路上。因此,接下来需要建立一个 .gitignore 档案,排除这些资料:
# djangogirls/.gitignore
djangogirls_venv
*.pyc
__pycache__
staticfiles
db.sqlite3
小结
最后的档案结构如下:
djangogirls
├──mysite
│ ├── mysite
│ │ ├── __init__.py
│ │ ├── production_settings.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── templates
│ ├── trips
│ └── manage.py
├── djangogirls_venv
├── .gitignore
├── Procfile
├── requirements.txt
└── runtime.txt
Deploy to Heroku
在开始部署(deploy)之前,请先确定你已经按照 教学手册 :
- 注册 Heroku 帐号: https://id.heroku.com/signup
- 安装 Heroku 工具箱: https://toolbelt.heroku.com/
Step 1: 登入 Heroku
安装完工具箱裡的 Heroku client 后,就可以使用 heroku
指令,首先让我们登入:
$ heroku login
输入注册时的 Email 帐号和密码,当你看到 Authentication successful. 时,表示认证成功。
Step 2: 新增一个新的 git repository
在 djangogirls
资料夹底下新增一个 git repository:
~/djangogirls$ git init
~/djangogirls$ git add .
~/djangogirls$ git commit -m "my djangogirls app"
Step 3-1: 新增新的 Heroku app
接下来,我们需要新增一个可以上传 repository 的地方,如果你之前已经新增过 app,请跳到 Step 3-2 :
~/djangogirls$ heroku create
预设 create
后面不放名字时,会自动产生随机名称的 Heroku app,如果想要命名自己的 app,如下:
~/djangogirls$ heroku create djangogirlsdiary
注意:
- Heroku app 是不能重名的,所以如果你也输入
djangogirlsdiary
,会得到! Name is already taken
的警告。 - Heroku app 名称会显示在 deploy 成功后的网址上,例如: https://djangogirlsdiary.herokuapp.com
Step 3-2: 指定已经存在的 app
如果你之前已经新增过 app ,并且想发佈在已经存在的 app 上时,可以先用指令 heroku apps
查看 app 的名称:
$ heroku apps
=== My Apps
djangogirlsdiary
然后设定成你想要上传的 app:
$ heroku git:remote -a djangogirlsdiary
Git remote heroku added.
最后透过 git remote -v
检查一下是否设定到正确的位置:
$ git remote -v
heroku https://git.heroku.com/djangogirlsdiary.git (fetch)
heroku https://git.heroku.com/djangogirlsdiary.git (push)
Step 4: 设定环境变数
我们利用 heroku config:set
指令设置 环境变数 ,以确保未来在 Heroku 执行任何指令时,都是使用到部署专用的设定档:
$ heroku config:set DJANGO_SETTINGS_MODULE=mysite.production_settings
Step 5: 利用 git push 上传到 Heroku
使用 git push
指令上传 git repository 后,你会发现它按照 runtime.txt 安装 python-3.4.3,也透过 pip 安装我们在 requirements.txt 上列出的所有套件:
~/djangogirls$ git push heroku master
...
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing runtime (python-3.4.3)
remote: -----> Installing dependencies with pip
...
remote: -----> Compressing... done, 50.8MB
remote: -----> Launching... done, v1
remote: https://djangogirlsdiary.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/djangogirlsdiary.git
* [new branch] master -> master
如果你遇到下列的错误讯息:
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
请透过下列指令新增 public key,然后再重新 git push
。
~/djangogirls$ heroku keys:add
Step 6: 启动 web process
先前建立了 Procfile 档案告诉 Heroku 启动时要执行的指令,现在我们使用指令启动 web process,并指定只需要 1 个 instance:
~/djangogirls$ heroku ps:scale web=1
Step 7: Django project 初始化
Django 已经成功启动了,但是我们还需要进行资料库初始化,利用 heroku run
可以在 Heroku 执行指令:
~/djangogirls$ heroku run python mysite/manage.py migrate
并为新资料库建立一个 superuser:
~/djangogirls$ heroku run python mysite/manage.py createsuperuser
Step 8: 开启浏览器观看你的网站
最后,透过 open
指令会自动在浏览器打开你的网站:
~/djangogirls$ heroku open
恭喜你成功地把网站发佈到网路上了!
因为资料库是不同的,之前在本机端的日记都需要再重新输入喔。
你可以分享网址给任何人: https://djangogirlsdiary.herokuapp.com/ 。记得前面要替换成你自己的 Heroku app 名称!
未来如果对网站进行任何修改并想更新到 Heroku,只要先确定 git commit 完成后再 push 到 Heroku 即可。
$ git push heroku master
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论