Deploy

2020-06-15 17:42 更新

Deploy

目前為止,我們所有的工作都是在本機(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)安裝好了。

部署準(zhǔn)備

為了讓 Server 了解部署時所需要的安裝環(huán)境,我們需要調(diào)整和準(zhǔn)備一些設(shè)定檔案。

requirements.txt

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

建立一個 Procfile 檔案,它告訴 Heroku 要執(zhí)行什麼指令來啟動我們的應(yīng)用:

web: gunicorn --pythonpath mysite mysite.wsgi

這一行<process_type>: <command>表示:

  • < process_type > -- 啟用web應(yīng)用
  • < command > -- Gunicorn 是原生支援 Django 的 Python WSGI Server,我們透過指令下列指令來啟動網(wǎng)站:

  • gunicorn --pythonpath<directory_path> <project_name>.wsgi

runtime.txt

為了讓 Heroku 知道要用哪一個版本的 Python,新增 runtime.txt 輸入:

python-3.4.1

production_settings.py

前面的章節(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.py

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 檔案等等 )

.gitignore

有一些檔案或資料夾在新增 git repository 時,不想被加入進(jìn)入。建立一個 .gitignore 檔案將我們的虛擬環(huán)境,本機(jī)資料庫等等放進(jìn)去:

VENV
*.pyc
__pycache__
staticfiles
db.sqlite3

小結(jié)

最后的檔案結(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 to Heroku

在開始部署 ( Deploy ) 之前,請先確定你已經(jīng)按照教學(xué)手冊

  1. 注冊 Heroku 帳號: https://id.heroku.com/signup
  2. 安裝 Heroku 工具箱: https://toolbelt.heroku.com/

Step 1: 登入 Heroku

安裝完工具箱裡的 Heroku client 后,你就可以使用 heroku 指令,讓我們先來登入:

$ heroku login

輸入注冊時的 Email 帳號和密碼,當(dāng)你看到Authentication successful. 時,表示認(rèn)證成功。

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 的地方,如果你之前已經(jīng)新增過 app,請?zhí)?Step 3-2

~/djangogirls$ heroku create

預(yù)設(shè)create后面不放名字時,會自動產(chǎn)生隨機(jī)名稱的 Heroku app,如果想要命名自己的 app,如下:

~/djangogirls$ heroku create djangogirlsdiary

注意:

  • Heroku app 是不能重名的,所以如果你也輸入djangogirlsdiary,會得到! Name is already taken的警告。
  • Heroku app 名稱會顯示在 deploy 成功后的網(wǎng)址上,例如: https://djangogirlsdiary.herokuapp.com

Step 3-2: 指定已經(jīng)存在的 app

如果你之前已經(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)

Step 4: 設(shè)定環(huán)境變數(shù)

我們利用heroku config:set指令設(shè)置 環(huán)境變數(shù),以確保未來在 Heroku 執(zhí)行任何指令時,都是使用到部署專用的設(shè)定檔:

$ heroku config:set DJANGO_SETTINGS_MODULE=mysite.production_settings

Step 5: 利用 git push 上傳到 Heroku

使用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

Step 6: 啟動 web process

先前建立了 Procfile 檔案告訴 Heroku 啟動時要執(zhí)行的指令,現(xiàn)在我們使用指令啟動 web process,并指定只需要1個 instance:

~/djangogirls$ heroku ps:scale web=1

Step 7: Django project 初始化

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

Step 8: 開啟瀏覽器觀看你的網(wǎng)站

最后,透過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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號