目前為止,我們所有的工作都是在本機(jī)端 ( localhost ) 完成,你可以在自己電腦上的瀏覽器看到成果。但是,一個網(wǎng)站必須放在穩(wěn)定的 Server 上部署 ( Deploy ) ,才能讓其他使用者隨時瀏覽觀看。
在眾多服務(wù)提供者中,我們選擇 Heroku 作為這次的范例, 它的免費額度足夠經(jīng)營一個小型網(wǎng)站,并擁有完善的開發(fā)者教學(xué)資源。
這一章,我們會根據(jù) 官方教學(xué) - "Getting Started with Django on Heroku" 稍作調(diào)整,教你如何準(zhǔn)備部署,并在 Heroku 上發(fā)佈你的網(wǎng)站。
首先,利用pip
安裝一些部署時需要用到的套件:
(VENV) ~/djangogirls$ pip install dj-database-url gunicorn dj-static
當(dāng)終端機(jī)顯示 Successfully installed... 時,表示必要的套件都已經(jīng)安裝好了。
為了讓 Server 了解部署時所需要的安裝環(huán)境,我們需要調(diào)整和準(zhǔn)備一些設(shè)定檔案。
在djangogirls
專案目錄底下,利用pip freeze
將此虛擬環(huán)境裡的 Python 套件全部條列出來,除了套件名稱還會包含版本資訊,儲存于 requirements.txt:
(VENV) ~/djangogirls$ pip freeze > requirements.txt
由于 Heroku 使用 PostgreSQL 資料庫, 我們在最后加上psycopg2==2.5.4
( Python 的 PostgreSQL 模組 ) ,檔案內(nèi)容范例如下,版本可能會稍有不同:
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 檔案,它告訴 Heroku 要執(zhí)行什麼指令來啟動我們的應(yīng)用:
web: gunicorn --pythonpath mysite mysite.wsgi
這一行<process_type>: <command>
表示:
web
應(yīng)用< command > -- Gunicorn 是原生支援 Django 的 Python WSGI Server,我們透過指令下列指令來啟動網(wǎng)站:
gunicorn --pythonpath
<directory_path> <project_name>.wsgi
為了讓 Heroku 知道要用哪一個版本的 Python,新增 runtime.txt 輸入:
python-3.4.1
前面的章節(jié),我們透過修改settings.py
來調(diào)整 Django project 的設(shè)定,但是通常正式上線 ( production ) 的環(huán)境會和開發(fā)/本機(jī) ( development / local ) 環(huán)境有所不同。
所以我們在mysite/mysite/
底下新建一個 production_settings.py
,專門放部署時所需要的設(shè)定:
# 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 - Web Server Gateway Interface,簡單來說,它是 Python 定義網(wǎng)頁程式和伺服器溝通的介面,修改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 檔案等等 )
有一些檔案或資料夾在新增 git repository 時,不想被加入進(jìn)入。建立一個 .gitignore 檔案將我們的虛擬環(huán)境,本機(jī)資料庫等等放進(jìn)去:
VENV
*.pyc
__pycache__
staticfiles
db.sqlite3
最后的檔案結(jié)構(gòu)如下:
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 ) 之前,請先確定你已經(jīng)按照教學(xué)手冊:
安裝完工具箱裡的 Heroku client 后,你就可以使用 heroku 指令,讓我們先來登入:
$ heroku login
輸入注冊時的 Email 帳號和密碼,當(dāng)你看到Authentication successful. 時,表示認(rèn)證成功。
在djangogirls
資料夾底下新增一個 git repository:
~/djangogirls$ git init
~/djangogirls$ git add .
~/djangogirls$ git commit -m "my djangogirls app"
接下來,我們需要新增一個可以上傳 repository 的地方,如果你之前已經(jīng)新增過 app,請?zhí)?Step 3-2:
~/djangogirls$ heroku create
預(yù)設(shè)create
后面不放名字時,會自動產(chǎn)生隨機(jī)名稱的 Heroku app,如果想要命名自己的 app,如下:
~/djangogirls$ heroku create djangogirlsdiary
注意:
djangogirlsdiary
,會得到! Name is already taken
的警告。如果你之前已經(jīng)新增過 app ,并且想發(fā)佈在已經(jīng)存在的 app 上時,可以先用指令heroku apps
查看 app 的名稱:
$ heroku apps
=== My Apps
djangogirlsdiary
然后設(shè)定成你想要上傳的 app:
$ heroku git:remote -a djangogirlsdiary
Git remote heroku added.
最后透過git remote -v
檢查一下是否設(shè)定到正確的位置:
$ git remote -v
heroku https://git.heroku.com/djangogirlsdiary.git (fetch)
heroku https://git.heroku.com/djangogirlsdiary.git (push)
我們利用heroku config:set
指令設(shè)置 環(huán)境變數(shù),以確保未來在 Heroku 執(zhí)行任何指令時,都是使用到部署專用的設(shè)定檔:
$ heroku config:set DJANGO_SETTINGS_MODULE=mysite.production_settings
使用git push
指令上傳 git repository 后,你會發(fā)現(xiàn)它按照 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
先前建立了 Procfile 檔案告訴 Heroku 啟動時要執(zhí)行的指令,現(xiàn)在我們使用指令啟動 web process,并指定只需要1
個 instance:
~/djangogirls$ heroku ps:scale web=1
Django 已經(jīng)成功啟動了,但是我們還需要進(jìn)行資料庫初始化,利用heroku run
可以在 Heroku 執(zhí)行指令:
~/djangogirls$ heroku run python mysite/manage.py migrate
并為新資料庫建立一個 superuser:
~/djangogirls$ heroku run python mysite/manage.py createsuperuser
最后,透過open
指令會自動在瀏覽器打開你的網(wǎng)站:
~/djangogirls$ heroku open
恭喜你成功地把網(wǎng)站發(fā)佈到網(wǎng)路上了!因為資料庫是不同的,之前在本機(jī)端的日記都需要再重新輸入喔。
你可以分享網(wǎng)址給任何人: https://djangogirlsdiary.herokuapp.com/ ( 記得前面要替換成你自己的 Heroku app 名稱 )
未來如果對網(wǎng)站進(jìn)行任何修改并想更新到 Heroku,只要先確定 git commit 完成后再 push 到 Heroku 即可。
$ git push heroku master
更多建議: