Deploy
Deploy
目前为止,我们所有的工作都是在本机端 ( localhost ) 完成,你可以在自己电脑上的浏览器看到成果。但是,一个网站必须放在稳定的 Server 上部署 ( Deploy ) ,才能让其他使用者随时浏览观看。
在众多服务提供者中,我们选择 Heroku 作为这次的范例, 它的免费额度足够经营一个小型网站,并拥有完善的开发者教学资源。
这一章,我们会根据 官方教学 - "Getting Started with Django on Heroku" 稍作调整,教你如何准备部署,并在 Heroku 上发佈你的网站。
安装部署工具
首先,利用pip
安装一些部署时需要用到的套件:
(VENV) ~/djangogirls$ pip install dj-database-url gunicorn dj-static
当终端机显示 Successfully installed... 时,表示必要的套件都已经安装好了。
部署准备
为了让 Server 了解部署时所需要的安装环境,我们需要调整和准备一些设定档案。
requirements.txt
在djangogirls
专案目录底下,利用pip freeze
将此虚拟环境裡的 Python 套件全部条列出来,除了套件名称还会包含版本资讯,储存于 requirements.txt:
(VENV) ~/djangogirls$ pip freeze > requirements.txt
由于 Heroku 使用 PostgreSQL 资料库, 我们在最后加上psycopg2==2.5.4
( Python 的 PostgreSQL 模组 ) ,档案内容范例如下,版本可能会稍有不同:
Django==1.7.7
dj-database-url==0.3.0
dj-static==0.0.6
gunicorn==19.3.0
static3==0.5.1
psycopg2==2.5.4
Procfile
建立一个 Procfile 档案,它告诉 Heroku 要执行什麽指令来启动我们的应用:
web: gunicorn --pythonpath mysite mysite.wsgi
这一行<process_type>: <command>
表示:
- < process_type > -- 启用
web
应用 -
< command > -- Gunicorn 是原生支援 Django 的 Python WSGI Server,我们透过指令下列指令来启动网站:
gunicorn --pythonpath
<directory_path> <project_name>.wsgi
runtime.txt
为了让 Heroku 知道要用哪一个版本的 Python,新增 runtime.txt 输入:
python-3.4.1
production_settings.py
前面的章节,我们透过修改settings.py
来调整 Django project 的设定,但是通常正式上线 ( production ) 的环境会和开发/本机 ( development / local ) 环境有所不同。
所以我们在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
TEMPLATE_DEBUG = False
wsgi.py
WSGI - Web Server Gateway Interface,简单来说,它是 Python 定义网页程式和伺服器沟通的介面,修改mysite/mysite/wsgi.py
如下:
## mysite/wsgi.py
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
加上 import dj_static 的部分,帮我们部署 static 档案 ( 例如图片,CSS 和 JavaScript 档案等等 )
.gitignore
有一些档案或资料夹在新增 git repository 时,不想被加入进入。建立一个 .gitignore 档案将我们的虚拟环境,本机资料库等等放进去:
VENV
*.pyc
__pycache__
staticfiles
db.sqlite3
小结
最后的档案结构如下:
djangogirls
├──mysite
│ ├── mysite
│ │ ├── __init__.py
│ │ ├── production_settings.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── templates
│ ├── trips
│ └── manage.py
├── 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.1,也透过 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.1)
remote: -----> Installing dependencies with pip
...
remote: -----> Compressing... done, 50.8MB
remote: -----> Launching... done, v5
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
更多建议: