iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0

建立Heroku帳號

首先先去 https://heroku.com/ 辦帳號,Heroku辦帳號是免費的,只要點sign up 就可以辦了

安裝Heroku Toolbelt

要在Heroku伺服器上部署和管理專案,我們需要用到Heroku Toolbelt中所提供的工具,我們需要在虛擬環境中輸入pip install dj-database-urlpip install dj-staticpip install static3pip install gunicorn

一定要照順序逐個執行這些指令,這樣我們就會知道哪些套件未能安裝,dj-database-url套件能協助Django與Heroku使用的資料庫進行溝通

建立requirements.txt放入套件清單

Heroku需要了解我們專案是依賴哪些套件,因此我們會用pip來生成一個檔案,在其中列出這些套件清單,首先啟動虛擬環境後輸入pip freeze > requirements.txt命令,freeze命令能讓pip把專案中目前安裝的所有套件名稱都寫入requirements.txt檔中,接著我們開啟這個txt檔案看看,然後在裡面新增下圖紅色框框的內容,新增的psycopg2能協助Heroku管理作用中的資料庫,如下

指定python版本

如果沒有指定python的版本,Heroku會使用目前python的預設版本,所以我們要先確定我們使用的python版本,我們要先在虛擬環境裡輸入python --version命令,我們就會看到它顯示的python版本,我們在這是用python3.7.0的版本,接下來我們要在manage.py所在的資料夾中建立一個runtime.txt檔,並輸入以下內容來指定python版本

修改setting.py來部署到Heroku

我們要開啟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來啟動處理程序

Procfile會告訴Heroku啟動哪些處理程序來正確地位專案提供服務,建立一個Procfile(P一定要大寫)檔案,不用設副檔名,存在和manage.py同一個資料夾中,檔案內容如下

web: gunicorn learning_log.wsgi --log-file -

這行程式告訴Heroku使用gunicorn作為伺服器,並使用learning_log資料夾中的wsgi.py中的設定來啟動應用程式

修改Heroku的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來追蹤檔案

Git是個版本控制程式,能讓我們每次成功時做出新功能時擷取專案程式碼的快照來備存,不論出現甚麼問題,都可以輕鬆還原到最新可用的那一個快照紀錄,每個快照都稱為commit

安裝Git

Heroku Toolbelt含有Git在其中,因此它應該已經安裝在系統內了,執行git --version命令,可以看到現在的版本

配置Git

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"

提交專案

  1. 執行git init命令,在learning log專案所在的目錄中初始化一個空的倉庫
  2. 我們執行git add .命令,這會把未被忽略的檔案新增到這個倉庫中
  3. 執行git commit -am "Ready for deployment to heroku"命令,其中-a旗標是讓Git在這個提交中放入所有修改過的檔案,-m旗標會讓Git記錄一條log訊息
  4. 執行git status命令,輸出指出目前位在master分支中,而工作目錄是乾淨的

推送到Heroku

  1. 執行heroku login來登入Heroku
  2. 執行heroku create建立一個空專案
  3. 執行git push heroku master命令讓Git把專案的master分支推送到Heroku剛才建立的倉庫中,Heroku會使用這些檔案在伺服器上建置專案,然後列出用來存取這個專案的URL
  4. 執行heroku ps命令會看到專案處於作用中的狀態
  5. 執行heroku open命令能免除開啟瀏覽器並輸入Heroku給定的URL

在Heroku上建置資料庫

我們需要執行一次遷移來設定即時資料庫,並套用我們在開發過程中生成的所有遷移,要對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譯


上一篇
DAY 28 Django允許使用者擁有自己的資料
下一篇
DAY 30 python的鐵人成就達成啦~
系列文
初學者Python的應用實作30

尚未有邦友留言

立即登入留言