首先先去 https://heroku.com/ 辦帳號,Heroku辦帳號是免費的,只要點sign up 就可以辦了
要在Heroku伺服器上部署和管理專案,我們需要用到Heroku Toolbelt中所提供的工具,我們需要在虛擬環境中輸入pip install dj-database-url
、pip install dj-static
、pip install static3
和pip install gunicorn
一定要照順序逐個執行這些指令,這樣我們就會知道哪些套件未能安裝,dj-database-url套件能協助Django與Heroku使用的資料庫進行溝通
Heroku需要了解我們專案是依賴哪些套件,因此我們會用pip來生成一個檔案,在其中列出這些套件清單,首先啟動虛擬環境後輸入pip freeze > requirements.txt
命令,freeze命令能讓pip把專案中目前安裝的所有套件名稱都寫入requirements.txt檔中,接著我們開啟這個txt檔案看看,然後在裡面新增下圖紅色框框的內容,新增的psycopg2能協助Heroku管理作用中的資料庫,如下
如果沒有指定python的版本,Heroku會使用目前python的預設版本,所以我們要先確定我們使用的python版本,我們要先在虛擬環境裡輸入python --version
命令,我們就會看到它顯示的python版本,我們在這是用python3.7.0的版本,接下來我們要在manage.py所在的資料夾中建立一個runtime.txt檔,並輸入以下內容來指定python版本
我們要開啟setting.py然後在最後面的位置加入一個部分來定義Heroku環境相關設定,如下
cwd = os.getcwd() # 取得工作目錄
if cwd == '/app' or cwd[:4] == '/tmp':
import dj_database_url # 匯入dj_database_url用在Heroku上來配置伺服器
DATABASES = {
'default': dj_database_url.config(default='postgres://localhost')
}
# 支援HTTPS的請求
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 確保Django會從Heroku的URL中尉專案提供服務
ALLOWED_HOSTS = ['learning-log-final.herokuapp.com']
DEBUG = False
# 設定專案讓它能在Heroku上正確提供靜態檔
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
Procfile會告訴Heroku啟動哪些處理程序來正確地位專案提供服務,建立一個Procfile(P一定要大寫)檔案,不用設副檔名,存在和manage.py同一個資料夾中,檔案內容如下
web: gunicorn learning_log.wsgi --log-file -
這行程式告訴Heroku使用gunicorn作為伺服器,並使用learning_log資料夾中的wsgi.py中的設定來啟動應用程式
我們匯入了能幫助正確提供靜態檔案的Cling,並用來啟動應用程式
import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling # 新增區塊
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learning_log.settings') # 新增區塊
application = Cling(get_wsgi_application())
在Heroku上Django會集合所有的靜態檔並放在一個地方,這樣能提高管理和運用的效率,我們會建立一個存放靜態檔案的目錄,在learning log/learning log/static的資料夾內,新增一個placeholder.txt,內容如下
This file ensures that learning_log/static/ will be added to the project.
Django will collect static files and place them in learning_log/static/.
Git是個版本控制程式,能讓我們每次成功時做出新功能時擷取專案程式碼的快照來備存,不論出現甚麼問題,都可以輕鬆還原到最新可用的那一個快照紀錄,每個快照都稱為commit
Heroku Toolbelt含有Git在其中,因此它應該已經安裝在系統內了,執行git --version
命令,可以看到現在的版本
Git可追蹤是誰修改了專案,就算專案只有一個人開發也是這樣的情況,若要開始記錄追蹤專案,Git會需要我們的名稱和email(learning_log) C:\Users\ASUS\learning_log>git config --global user.name "weiting"
(learning_log) C:\Users\ASUS\learning_log>git config --global user.email "b22379222@gmail.com"
git init
命令,在learning log專案所在的目錄中初始化一個空的倉庫git add .
命令,這會把未被忽略的檔案新增到這個倉庫中git commit -am "Ready for deployment to heroku"
命令,其中-a旗標是讓Git在這個提交中放入所有修改過的檔案,-m旗標會讓Git記錄一條log訊息git status
命令,輸出指出目前位在master分支中,而工作目錄是乾淨的heroku login
來登入Herokuheroku create
建立一個空專案git push heroku master
命令讓Git把專案的master分支推送到Heroku剛才建立的倉庫中,Heroku會使用這些檔案在伺服器上建置專案,然後列出用來存取這個專案的URLheroku ps
命令會看到專案處於作用中的狀態heroku open
命令能免除開啟瀏覽器並輸入Heroku給定的URL我們需要執行一次遷移來設定即時資料庫,並套用我們在開發過程中生成的所有遷移,要對Heroku專案執行Django和Python的命令,可使用heroku run命令,執行heroku run python manage.py migrate
命令,在這裡Django套用預設的遷移和我們在開發learning log期間生成的遷移
好了~我們的Django實作部分如期的在十天內結束了,IT的30天也差不多到了結尾,明天會最後一篇會打這30天的心得感想
附上排版較精美的
HackMD網址:https://hackmd.io/MpDyV3uSSxu9bLGeeMeSRg
資料來源:<<python程式設計的樂趣>>-Eric Matthes著/H&C譯